Назад | Перейти на главную страницу

Что вызывает такое странное поведение с mod_rewrite?

Вот мое правило:

RewriteRule ^user/(\d+)$ rewrite.php?id=$1

Это перенаправляет, но $_GET['id'] не установлен. Если я изменю приведенное выше правило на:

RewriteRule ^anything/(\d+)$ rewrite.php?id=$1

Оно работает. Почему один работает, а другой нет?

Вот дополнительная информация:

Обновить: Я проверил rewritelog и он пуст.

Это произойдет, если MultiViews включен (часть mod_negotiation). Если MultiViews включен и вы запрашиваете /user, где /user.php существует как физический файл, тогда mod_negotiation запускает внутренний подзапрос для users.php (он «ищет» подходящий файл, который вернет правильный mime-тип).

Вам необходимо отключить MultiViews в вашем .htaccess файл:

Options -MultiViews

MultiViews по умолчанию отключен в Apache, однако некоторые общие хосты по какой-то причине включают это.

Я наконец нашел причину проблемы ... Очевидно (и это нигде не задокументировано, чтобы я мог найти), если у вас есть файл (в данном случае PHP) с тем же именем, что и первый виртуальный каталог правило перезаписи не работает. (Циклы перенаправления, отсутствующие параметры и т. Д.)

Например, следующее правило:

#RewriteRule ^user/(\d+)$ user.php?id=$1 [L]

Не будет работать, если есть файл с именем user.php в том же каталоге, что и файл PHP.