У меня проблемы с настройкой 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
Вы пробовали использовать QSA (добавление строки запроса) флаг?
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 или оставив все вместе.
Решением было изменить конфигурацию 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>
Однако я не знаю, почему это работает
Отключите -MultiViews в вашем файле htaccess, как показано ниже
RewriteEngine on
Options -Indexes -MultiViews
RewriteRule ^static/([^/]+)/([^/]+) /static.php?sISOCode=$1&sPage=$2
это решит проблему