mod_rewrite não encaminha parâmetros GET

9

Estou tendo problemas para configurar o Apache com mod_rewrite na minha máquina de desenvolvimento. O 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();

Quais impressões (removidos 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 sendo cumpridos. 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 produzem nada quando isso acontece. Todas as idéias apreciadas.

Um exemplo de regra que funciona, para o mesmo arquivo:

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

Respostas:

16

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

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

EDITAR E RESPOSTA REAL ABAIXO:

Esse problema é causado pela modificação da negociação do Apache , em particular a opção MultiViews que você está usando:

O efeito do MultiViews é o seguinte: se o servidor receber uma solicitação para / some / dir / foo, se / some / dir tiver MultiViews ativado e / some / dir / foo não existir, o servidor lerá o diretório procurando arquivos nomeados foo. * e efetivamente cria um mapa de tipos que nomeia todos esses arquivos, atribuindo a eles os mesmos tipos de mídia e codificação de conteúdo que teriam se o cliente solicitasse um deles por nome. Em seguida, escolhe a melhor correspondência para os requisitos do cliente.

A ativação de múltiplas visualizações diz ao Apache para adivinhar qual arquivo usar quando o URI não apontar para um local existente.

Solução:

Desative multiviews usando -MultiViewsno seu .htaccess ou deixando-o de fora.

Aron Rotteveel
fonte
1
Também queria sugerir isso, mas o que não recebi: não deve ser necessário - pelo menos acho que não depois de ler o manual. Curioso como esta questão vai sair
pilif
1
Infelizmente, o sinalizador QSA não muda nada nessa situação. Os parâmetros GET são anexados pela regra, não a partir do URL original.
Vegard Larsen
2

A solução foi alterar 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>

Não sei por que isso funciona, no entanto

Vegard Larsen
fonte
2
Veja a minha resposta anterior revisto para uma explicação: serverfault.com/questions/60/...
Aron Rotteveel
0

Desative -MultiViews no seu arquivo htaccess, como abaixo

RewriteEngine on
Options -Indexes -MultiViews

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

isso vai resolver o problema

Vikas Kandari
fonte