mod_rewrite non inoltra i parametri GET


9

Ho problemi a configurare Apache con mod_rewrite sulla mia macchina di sviluppo. Mod_rewrite è attivo e funziona bene per alcune regole. Alcune regole non funzionano come previsto, come questa:

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

In static.php lo faccio (per il debug):

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

Quale stampa (rimosso alcuni elementi dall'array $ _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
)

In qualche modo i parametri GET impostati in base alla regola non stanno superando. Lo stesso file .htaccess è in uso su altre configurazioni e funziona bene. La configurazione di Apache per questo dominio virtuale:

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

Il registro di accesso e il registro degli errori non generano nulla quando ciò accade. Qualche idea apprezzata.

Un esempio di una regola che funziona, per lo stesso file:

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

Risposte:


16

Hai provato a usare il flag QSA (Query String Append) ?

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

MODIFICA E RISPOSTA EFFETTIVA SOTTO:

Questo problema è causato dalla mod_negotiation di Apache , in particolare dall'opzione MultiViews che stai utilizzando:

L'effetto di MultiViews è il seguente: se il server riceve una richiesta per / some / dir / foo, se / some / dir ha MultiViews abilitato e / some / dir / foo non esiste, il server legge la directory che cerca file di nome foo. * e crea in modo efficace una mappa dei tipi che denomina tutti quei file, assegnando loro gli stessi tipi di media e codifiche di contenuto che avrebbe se il client ne avesse richiesto uno per nome. Quindi sceglie la migliore corrispondenza alle esigenze del cliente.

L'abilitazione di Multiviews dice ad Apache di indovinare quale file utilizzare quando l'URI in realtà non punta a una posizione esistente.

Soluzione:

Disabilita le visualizzazioni multiple usando il -MultiViewstuo .htaccess o lasciandolo fuori tutto insieme.


1
Volevo suggerire anche questo, ma quello che non capisco: non dovrebbe essere necessario - almeno non lo penso dopo aver letto il manuale. Curioso come andrà a finire questa domanda
pilif

1
La bandiera QSA non cambia nulla in questa situazione, sfortunatamente. I parametri GET sono aggiunti dalla regola, non dall'URL originale.
Vegard Larsen,

2

La soluzione era cambiare la configurazione di Apache, in questo modo:

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

Non so perché funzioni, comunque


2
Vedere la mia risposta precedente rivista per una spiegazione: serverfault.com/questions/60/…
Aron Rotteveel,

0

Disattiva -MultiViews nel tuo file htaccess come qui sotto

RewriteEngine on
Options -Indexes -MultiViews

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

questo risolverà il problema

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.