mod_rewrite ne transmet pas les paramètres GET

9

J'ai du mal à configurer Apache avec mod_rewrite sur ma machine de développement. Mod_rewrite est actif et fonctionne bien pour certaines règles. Certaines règles ne fonctionnent pas comme prévu, comme celle-ci:

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

Dans static.php, je fais cela (pour le débogage):

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

Quelles impressions (ont supprimé certains éléments du tableau $ _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
)

D'une manière ou d'une autre, les paramètres GET définis selon la règle ne passent pas. Le même fichier .htaccess est utilisé sur d'autres configurations et fonctionne bien. La configuration Apache pour ce domaine virtuel:

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

Le journal d'accès et le journal des erreurs ne produisent rien lorsque cela se produit. Toutes les idées appréciées.

Un exemple de règle qui fonctionne, pour le même fichier:

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

Réponses:

16

Avez-vous essayé d'utiliser l' indicateur QSA (Query String Append) ?

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

MODIFIER ET RÉPONDRE RÉELLE CI-DESSOUS:

Ce problème est dû à la mod_negotiation d'Apache , en particulier l'option MultiViews que vous utilisez:

L'effet de MultiViews est le suivant: si le serveur reçoit une demande de / some / dir / foo, si / some / dir a MultiViews activé et / some / dir / foo n'existe pas, alors le serveur lit le répertoire recherché fichiers nommés foo. *, et simule efficacement une carte de types qui nomme tous ces fichiers, en leur attribuant les mêmes types de médias et les mêmes encodages de contenu que si le client avait demandé l'un d'eux par leur nom. Il choisit ensuite la meilleure correspondance avec les exigences du client.

L'activation de Multiviews indique à Apache de deviner quel fichier utiliser lorsque l'URI ne pointe pas réellement vers un emplacement existant.

Solution:

Désactivez les multivues soit en les utilisant -MultiViewsdans votre .htaccess, soit en les laissant tous ensemble.

Aron Rotteveel
la source
1
Je voulais suggérer cela aussi, mais ce que je ne comprends pas: cela ne devrait pas être nécessaire - du moins je ne le pense pas après avoir lu le manuel. Curieux de savoir comment cette question se
terminera
1
Malheureusement, le drapeau QSA ne change rien à cette situation. Les paramètres GET sont ajoutés par la règle, pas à partir de l'URL d'origine.
Vegard Larsen
2

La solution était de changer la configuration d'Apache, comme ceci:

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

Je ne sais pas pourquoi cela fonctionne, cependant

Vegard Larsen
la source
2
Voir ma réponse précédente révisée pour une explication: serverfault.com/questions/60/…
Aron Rotteveel
0

Désactivez -MultiViews dans votre fichier htaccess quelque chose comme ci-dessous

RewriteEngine on
Options -Indexes -MultiViews

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

cela résoudra le problème

Vikas Kandari
la source