Вот мое правило:
RewriteRule ^user/(\d+)$ rewrite.php?id=$1
Это перенаправляет, но $_GET['id']
не установлен. Если я изменю приведенное выше правило на:
RewriteRule ^anything/(\d+)$ rewrite.php?id=$1
Оно работает. Почему один работает, а другой нет?
Вот дополнительная информация:
user
anything
можно заменить чем угодно, кроме user
.Обновить: Я проверил 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.