mod_rewrite не передает параметры GET

9

У меня проблемы с настройкой Apache с mod_rewrite на моей машине для разработки. Mod_rewrite активен и хорошо работает для некоторых правил. Некоторые правила не работают так, как задумано, например:

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

В static.php я делаю это (для отладки):

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

Какие распечатки (удалены некоторые элементы из массива $ _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
)

Каким-то образом параметры GET, установленные согласно правилу, не проходят. Тот же файл .htaccess используется для других настроек и работает хорошо. Конфигурация Apache для этого виртуального домена:

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

Журнал доступа и журнал ошибок ничего не выводят, когда это происходит. Любые идеи приветствуются.

Пример правила, которое работает для того же файла:

RewriteRule ^faq/?$                   /static.php?sISOCode=no&sPage=faq
Вегард Ларсен
источник

Ответы:

16

Вы пытались использовать флаг QSA (Query String Append) ?

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

РЕДАКТИРОВАТЬ И АКТУАЛЬНЫЙ ОТВЕТ НИЖЕ:

Эта проблема вызвана Apache mod_negotiation , в частности опция MultiViews, которую вы используете:

Эффект MultiViews заключается в следующем: если сервер получает запрос для / some / dir / foo, если / some / dir имеет включенные MultiViews и / some / dir / foo не существует, то сервер читает каталог, ища файлы с именем foo. *, и эффективно подделывает карту типов, которая именует все эти файлы, назначая им те же типы медиа и кодировки контента, которые были бы у него, если бы клиент запросил один из них по имени. Затем он выбирает лучшее соответствие требованиям клиента.

Включение Multiviews говорит Apache, чтобы угадать, какой файл использовать, когда URI фактически не указывает на существующее местоположение.

Решение:

Отключите множественные просмотры, используя -MultiViewsв своем .htaccess или оставив все вместе.

Арон Роттвил
источник
1
Я тоже хотел это предложить, но то, что я не понимаю: это не нужно - по крайней мере, я так не думаю после прочтения руководства. Любопытно, как этот вопрос получится
Pilif
1
К сожалению, флаг QSA ничего не меняет в этой ситуации. Параметры GET добавляются правилом, а не из исходного URL.
Вегард Ларсен
2

Решением было изменить конфигурацию Apache, например так:

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

Я не знаю, почему это работает, однако

Вегард Ларсен
источник
2
См. Мой пересмотренный предыдущий ответ для объяснения: serverfault.com/questions/60/…
Арон Роттвил
0

Отключите -MultiViews в вашем файле htaccess, как показано ниже

RewriteEngine on
Options -Indexes -MultiViews

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

это решит проблему

Викас Кандари
источник