ti-enxame.com

mod_rewrite não encaminha para obter parâmetros

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

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

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

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

Quais impressões (removidas 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] => [email protected]
    [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 obtêm 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 [email protected]
        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 são nada quando isso acontece. Alguma ideia apreciada.

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

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

Você já tentou usar o QSA (Append da String de Query) Bandeira?

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

Editar e resposta real abaixo:

Esse problema é causado pelo Apache's mod_negoTiation , em particular a opção MultiViews que você está usando:

O efeito do MultiViews é o seguinte: Se o servidor receber uma solicitação de/Alguns/dir/foo, se/alguns/dir de MultiViews habilitados, e/Alguns/dir/foo não existirem, o servidor lê o diretório que procura Arquivos denominados Foo. * e efetivamente confira um mapa que nomes todos esses arquivos, atribuindo-lhes os mesmos tipos de mídia e codificação de conteúdo que teria se o cliente pedisse um deles pelo nome. Em seguida, escolhe a melhor correspondência para os requisitos do cliente.

Ativando a MultiViews informa ao Apache para adivinhar qual arquivo usar quando o URI não aponta para um local existente.

Solução:

Desativar multivisões usando -MultiViews no seu .htaccess ou deixando tudo juntos.

16
Aron Rotteveel

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

<VirtualHost *:80>
        ServerAdmin [email protected]
        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

2
Vegard Larsen

Desativar -Multivistas no seu arquivo HTAccess algo como abaixo

RewriteEngine on
Options -Indexes -MultiViews

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

isso resolverá a questão

0
Vikas Kandari