mod_rewrite no reenvía parámetros GET

9

Tengo problemas para configurar Apache con mod_rewrite en mi máquina de desarrollo. Mod_rewrite está activo y funciona bien para algunas reglas. Algunas reglas no funcionan según lo previsto, como esta:

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

En static.php hago esto (para depurar):

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

Qué impresiones (eliminó algunos elementos de la matriz $ _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
)

De alguna manera, los parámetros GET establecidos de acuerdo con la regla no se están transmitiendo. El mismo archivo .htaccess se usa en otras configuraciones y funciona bien. La configuración de Apache para este dominio virtual:

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

El registro de acceso y el registro de errores no generan nada cuando esto sucede. Cualquier idea apreciada.

Un ejemplo de una regla que funciona, para el mismo archivo:

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

Respuestas:

16

¿Has intentado usar el indicador QSA (Query String Append) ?

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

EDITAR Y RESPUESTA REAL A CONTINUACIÓN:

Este problema es causado por la mod_negotiation de Apache , en particular la opción MultiViews que está utilizando:

El efecto de MultiViews es el siguiente: si el servidor recibe una solicitud de / some / dir / foo, si / some / dir tiene MultiViews habilitados y / some / dir / foo no existe, el servidor lee el directorio buscando archivos llamados foo. *, y falsifica efectivamente un mapa de tipos que nombra todos esos archivos, asignándoles los mismos tipos de medios y codificaciones de contenido que tendría si el cliente hubiera pedido uno de ellos por nombre. Luego elige la mejor combinación para los requisitos del cliente.

Habilitar Multiviews le dice a Apache que adivine qué archivo usar cuando el URI en realidad no apunta a una ubicación existente.

Solución:

Deshabilite las vistas múltiples mediante el uso -MultiViewsde su .htaccess o dejándolo todo junto.

Aron Rotteveel
fuente
1
También quería sugerir eso, pero lo que no entiendo: no debería ser necesario, al menos no lo creo después de leer el manual. Curioso cómo resultará esta pregunta
pilif
1
La bandera QSA no cambia nada en esta situación, desafortunadamente. Los parámetros GET se agregan por la regla, no desde la URL original.
Vegard Larsen el
2

La solución fue cambiar la configuración de Apache, así:

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

Sin embargo, no sé por qué funciona esto

Vegard Larsen
fuente
2
Consulte mi respuesta anterior revisada para obtener una explicación: serverfault.com/questions/60/…
Aron Rotteveel
0

Deshabilite -MultiViews en su archivo htaccess algo como a continuación

RewriteEngine on
Options -Indexes -MultiViews

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

esto resolverá el problema

Vikas Kandari
fuente