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 (додаток до рядка запитів) ?

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

РЕДАКТУЙТЕ ТА АКТУАЛЬНИЙ ВІДПОВІДЬ нижче:

Ця проблема викликана mod_negotiation Apache , зокрема опцією MultiViews, яку ви використовуєте:

Ефект MultiViews полягає в наступному: якщо сервер отримує запит на / some / dir / foo, якщо / some / dir увімкнено функцію MultiView, і / 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

це вирішить питання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.