я хочу https://www.example.com/somePage.php?id=1234
быть перенаправленным на https://www.example.com/tool/1234
(чтобы старые ссылки и закладки работали).
Я думаю, что близок, но это, похоже, не работает ...
RewriteRule ^somePage.php?toolid=([0-9]+)$ /tool/$1 [R=301,L]
Что здесь не так?
Вы не можете сопоставить строку запроса в RewriteRule
шаблон. Вам нужно использовать RewriteCond
директиву и сравните с QUERY_STRING
серверная переменная.
Но также, если у вас есть внутренняя перезапись позже в вашем файле конфигурации, которая перезаписывает (реальный) уродливый URL-адрес, вы не можете выполнить простое перенаправление, так как это приведет к циклу перенаправления. Убедитесь, что вы перенаправляете только первоначальный запрос, а не переписанный URL.
Предполагая, что это .htaccess
, на основе ваших существующих RewriteRule
шаблонпопробуйте следующее в верхней части файла конфигурации:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^toolid=(/d+)$
RewriteRule ^somePage\.php$ /tool/%1 [R=301,L]
Однако обратите внимание, что URL-адреса вашего примера отличаются от вашего примера кода. Я использовал ваш пример кода.
В REDIRECT_STATUS
переменная окружения пуста при первоначальном запросе, но получает значение "200" после успешной внутренней перезаписи. Таким образом, это позволяет избежать цикла перенаправления в каждом каталоге .htaccess
файлы.
Убедитесь, что вы очистили кеш браузера, поскольку все ошибочные 301-е (во время тестирования) будут кешированы браузером.