Ответ
MrWhite был прав. Вы должны добавить R=302
или R=301
, чтобы выполнить перенаправление. Обычная перезапись не будет работать.
RewriteCond %{QUERY_STRING} ^uid=(\d+)$
RewriteRule ^$ /user/%1? [L,R=302]
Причина
Итак, способ Laravel работает так:
- вы запрашиваете
/some/file
- .htaccess сообщает apache, "эй apache, если у вас есть запрос на файл, который не существует, просто сделайте вид, что он для
index.php
" - apache говорит: «эй php, у меня есть запрос на запуск
index.php
, а URL-адрес /some/file
» - php запускает скрипт, который --whoah - это огромное laravel приложение
- что угодно, "эй laravel, сервер сказал
/some/file
- это URL" - laravel делает все свои причудливые вещи, и это пытается сопоставить URL с одним из ваших маршрутов
Теперь я добавил правило для перезаписи определенного URL на виртуальный URL, который Laravel должен обрабатывать. Я сопоставлял параметры запроса, но это не имело значения. (подробности см. ниже)
Когда модуль перезаписи Apache обнаруживает RewriteRule без флага [R], он перезаписывает URL-адрес и отправляет его обратно в обработчик URL-адресов. Затем обработчик URL-адреса Apache обрабатывает новый URL-адрес в соответствии со всеми правилами, в том числе в любых применимых файлах .htaccess.
Таким образом, все надлежащие правила did применяются.
Вот ключевое открытие: Первоначально запрошенный URL-адрес никогда не менялся. Поэтому, хотя Apache удалось передать запрос PHP с правильным файлом, он также был отправка по старому URL.
Поэтому мы должны указать Apache отправить ответ 301 или 302 Redirect, вместо того, чтобы просто переписать запрос . Пользователь отправит еще один запрос с URL-адресом, который необходим Laravel для разрешения маршрута.
Но как быть с другим поведением с / без скобок?
Ответ лежит в пределах Laravel по умолчанию .htaccess. Давайте посмотрим мои старые правила без скобок:
RewriteCond %{QUERY_STRING} ^uid=\d+$
RewriteRule ^$ /user/%1? [L]
Без скобок, чтобы получить значение uid, %1
пусто. Таким образом, мы в конечном итоге переписываем URL просто на /user/
.
Теперь нам нужно взглянуть на другой набор Laravel правил:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
Это нормализует URL, так что виртуальные пути / маршруты не содержат конечных слешей. Это облегчает анализ маршрута.
Возвращает 301 Redirect для `/ users '. Это очень отличается от 200, которые мы получали с круглыми скобками, но это не значит, что круглые скобки вели себя по-другому. Как сказал г-н Уайт в комментариях, наверняка этим занимался кто-то другой.
Надеюсь, вам понравилась поездка. И я еще больше надеюсь, что это спасет бедную, растерянную душу от часов мучений. :)