mod_rewrite nie przekazuje parametrów GET

9

Mam problem z konfiguracją Apache z mod_rewrite na moim komputerze programistycznym. Mod_rewrite jest aktywny i działa dobrze dla niektórych reguł. Niektóre reguły nie działają zgodnie z przeznaczeniem, na przykład:

RewriteRule ^static/([^/]+)/([^/]+)     /static.php?sISOCode=$1&sPage=$2

W static.php robię to (w celu debugowania):

<?php
print_r($_GET); print_r($_POST); print_r($_SERVER); die();

Które wydruki (usunęły niektóre elementy z tablicy $ _SERVER):

Array
(
)
Array
(
)
Array
(
    [SERVER_SIGNATURE] => <address>Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.1 with Suhosin-Patch Server at alpha.prove.no Port 80</address>
    [SERVER_SOFTWARE] => Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.1 with Suhosin-Patch
    [SERVER_ADDR] => 127.0.0.1
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 127.0.0.1
    [DOCUMENT_ROOT] => /home/veg/workspace/project
    [SERVER_ADMIN] => webmaster@localhost
    [SCRIPT_FILENAME] => /home/veg/workspace/project/static.php
    [REMOTE_PORT] => 38954
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => 
    [REQUEST_URI] => /static/no/startCar
    [SCRIPT_NAME] => /static.php
    [PATH_INFO] => /no/startCar
    [PATH_TRANSLATED] => redirect:/index.php/startCar
    [PHP_SELF] => /static.php/no/startCar
    [argv] => Array
        (
        )
    [argc] => 0
)

Jakoś parametry GET ustawione zgodnie z regułą się nie przedostają. Ten sam plik .htaccess jest używany w innych konfiguracjach i działa dobrze. Konfiguracja Apache dla tej domeny wirtualnej:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName project.example.com

        DocumentRoot /home/veg/workspace/project
        <Directory /home/veg/workspace/project>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
</VirtualHost>

Dziennik dostępu i dziennik błędów nie generują niczego, gdy tak się dzieje. Doceniamy wszelkie pomysły.

Przykład reguły, która działa dla tego samego pliku:

RewriteRule ^faq/?$                   /static.php?sISOCode=no&sPage=faq
Vegard Larsen
źródło

Odpowiedzi:

16

Czy próbowałeś użyć flagi QSA (Query String Append) ?

RewriteRule ^static/([^/]+)/([^/]+) /static.php?sISOCode=$1&sPage=$2 [QSA]

EDYTUJ I RZECZYWISTA ODPOWIEDŹ:

Przyczyną tego problemu jest mod_negotiation Apache , w szczególności używana przez Ciebie opcja MultiView:

Efekt działania MultiView jest następujący: jeśli serwer otrzyma żądanie dotyczące / some / dir / foo, jeśli / some / dir ma włączone MultiViews, a / some / dir / foo nie istnieje, to serwer odczytuje katalog szukający katalogu pliki o nazwie foo. * i skutecznie fałszują mapę typów, która nazywa wszystkie te pliki, przypisując im te same typy nośników i kodowania treści, jakie miałby, gdyby klient poprosił o jeden z nich według nazwy. Następnie wybiera najlepsze dopasowanie do wymagań klienta.

Włączenie widoku z wielu kamer informuje Apache, aby odgadł, którego pliku użyć, gdy URI nie wskazuje faktycznie istniejącej lokalizacji.

Rozwiązanie:

Wyłącz widok z wielu kamer, używając go -MultiViewsw swoim .htaccess lub pomijając to wszystko razem.

Aron Rotteveel
źródło
1
Chciałem to również zasugerować, ale czego nie dostaję: nie powinno to być potrzebne - przynajmniej nie sądzę po przeczytaniu instrukcji. Ciekawe, jak to pytanie się skończy
pilif
1
Niestety flaga QSA nic nie zmienia w tej sytuacji. Parametry GET są dodawane przez regułę, a nie z oryginalnego adresu URL.
Vegard Larsen
2

Rozwiązaniem była zmiana konfiguracji Apache, w następujący sposób:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName project.example.com

        DocumentRoot /home/veg/workspace/project
        <Directory /home/veg/workspace/project>
                Options FollowSymLinks
                # AllowOverride All
                # Order allow,deny
                # allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
</VirtualHost>

Nie wiem jednak, dlaczego to działa

Vegard Larsen
źródło
2
Zobacz moją poprawioną poprzednią odpowiedź, aby uzyskać wyjaśnienie: serverfault.com/questions/60/…
Aron Rotteveel
0

Wyłącz -MultiViews w swoim pliku htaccess, tak jak poniżej

RewriteEngine on
Options -Indexes -MultiViews

RewriteRule ^static/([^/]+)/([^/]+)     /static.php?sISOCode=$1&sPage=$2

to rozwiąże problem

Vikas Kandari
źródło