Вопросы
Войти

и mod_rewrite не пересылает вам параметров

Vegard Larsen

У меня возникли проблемы настройка 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] => [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
)

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

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

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

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

RewriteRule ^faq/?$                   /static.php?sISOCode=no&sPage=faq
php
apache-2.2
mod-rewrite
rewrite
2 Ответов
Aron Rotteveel

Вы пробовали с помощью Типа QSA (добавлять строку запроса) флаг?

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

РЕДАКТИРОВАТЬ И ФАКТИЧЕСКИЙ ОТВЕТ НИЖЕ:

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

Влияние опция multiviews как образом: если сервер получает запрос /некоторые/реж/ФОО, если /некоторые/реж включена опция multiviews, и /некоторые/реж/ФОО не существует, тогда сервер считывает каталог ищу файлы с именем foo.*, и эффективно фейки карту, тип которой имена всех те файлы, присваивая им те же типы СМИ и контент-кодирования он если бы клиент попросил один из них по имени. Затем он выбирает лучший матч для клиента требования.

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

Решение:

Отключить мультипросмотр с помощью -MultiViews в вашем .htaccess или оставляя его все вместе.

Vegard Larsen

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

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

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