mod_rewrite leitet keine GET-Parameter weiter

9

Ich habe Probleme beim Einrichten von Apache mit mod_rewrite auf meinem Entwicklungscomputer. Mod_rewrite ist aktiv und funktioniert für einige Regeln gut. Einige Regeln funktionieren nicht wie beabsichtigt, wie diese:

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

In static.php mache ich das (zum Debuggen):

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

Welche Drucke (einige Elemente aus dem Array $ _SERVER entfernt):

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
)

Irgendwie kommen die gemäß der Regel eingestellten GET-Parameter nicht durch. Dieselbe .htaccess-Datei wird in anderen Setups verwendet und funktioniert gut. Die Apache-Konfiguration für diese virtuelle Domäne:

<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>

Das Zugriffsprotokoll und das Fehlerprotokoll geben in diesem Fall nichts aus. Irgendwelche Ideen geschätzt.

Ein Beispiel für eine Regel, die für dieselbe Datei funktioniert:

RewriteRule ^faq/?$                   /static.php?sISOCode=no&sPage=faq
Vegard Larsen
quelle

Antworten:

16

Haben Sie versucht, das QSA-Flag (Query String Append) zu verwenden?

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

BEARBEITEN UND TATSÄCHLICHE ANTWORT UNTEN:

Dieses Problem wird durch die mod_negotiation von Apache verursacht , insbesondere durch die von Ihnen verwendete MultiViews-Option:

MultiViews haben folgende Auswirkungen: Wenn der Server eine Anforderung für / some / dir / foo empfängt, wenn in / some / dir MultiViews aktiviert sind und / some / dir / foo nicht vorhanden ist, liest der Server das gesuchte Verzeichnis Dateien mit dem Namen foo. * und fälschen effektiv eine Typzuordnung, in der alle diese Dateien benannt werden, und weisen ihnen dieselben Medientypen und Inhaltscodierungen zu, die sie hätten, wenn der Client nach einer davon mit Namen gefragt hätte. Anschließend wird die beste Übereinstimmung mit den Anforderungen des Kunden ausgewählt.

Durch das Aktivieren von Multiviews wird Apache angewiesen, zu erraten, welche Datei verwendet werden soll, wenn der URI nicht tatsächlich auf einen vorhandenen Speicherort verweist.

Lösung:

Deaktivieren Sie Multiviews, indem Sie entweder -MultiViewsin .htaccess verwenden oder alles zusammen weglassen .

Aron Rotteveel
quelle
1
Ich wollte das auch vorschlagen, aber was ich nicht verstehe: Es sollte nicht benötigt werden - zumindest glaube ich das nicht, nachdem ich das Handbuch gelesen habe. Neugierig, wie sich diese Frage entwickeln wird
Pilif
1
Die QSA-Flagge ändert in dieser Situation leider nichts. Die GET-Parameter werden an die Regel angehängt, nicht an die ursprüngliche URL.
Vegard Larsen
2

Die Lösung bestand darin, die Apache-Konfiguration folgendermaßen zu ändern:

<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>

Ich weiß jedoch nicht, warum das funktioniert

Vegard Larsen
quelle
2
Eine Erklärung finden Sie in meiner überarbeiteten vorherigen Antwort: serverfault.com/questions/60/…
Aron Rotteveel
0

Deaktivieren Sie -MultiViews in Ihrer htaccess-Datei wie folgt

RewriteEngine on
Options -Indexes -MultiViews

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

Dies wird das Problem lösen

Vikas Kandari
quelle