mod_rewrite não encaminha os parâmetros GET

9

Estou tendo problemas para configurar o Apache com o mod_rewrite na minha máquina de desenvolvimento. Mod_rewrite está ativo e funciona bem para algumas regras. Algumas regras não funcionam como pretendido, como esta:

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

No static.php eu faço isso (para depuração):

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

Que imprime (removeu alguns itens da 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 alguma forma, os parâmetros GET definidos de acordo com a regra não estão passando. O mesmo arquivo .htaccess está em uso em outras configurações e funciona bem. A configuração do Apache para este domínio 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>

O log de acesso e o log de erros não geram nada quando isso acontece. Qualquer idéia apreciada.

Um exemplo de regra que funciona para o mesmo arquivo:

RewriteRule ^faq/?$                   /static.php?sISOCode=no&sPage=faq
    
por Vegard Larsen 30.04.2009 / 10:18

2 respostas

14

Você já tentou usar o sinalizador QSA (Query String Append) ?

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

EDITAR E ATENDER ATUALMENTE ABAIXO:

Este problema é causado pelo mod_negotiation do Apache, em particular a opção MultiViews que você está usando:

The effect of MultiViews is as follows: if the server receives a request for /some/dir/foo, if /some/dir has MultiViews enabled, and /some/dir/foo does not exist, then the server reads the directory looking for files named foo.*, and effectively fakes up a type map which names all those files, assigning them the same media types and content-encodings it would have if the client had asked for one of them by name. It then chooses the best match to the client's requirements.

Ativar o Multiviews informa ao Apache para adivinhar qual arquivo usar quando o URI não aponta para um local existente.

Solução:

Desative as multiviews usando -MultiViews no seu .htaccess ou deixando-as juntas.

    
por 30.04.2009 / 10:32
2

A solução foi mudar a configuração do Apache, assim:

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

Eu não sei porque isso funciona, no entanto

    
por 30.04.2009 / 11:10