#apache #.htaccess #redirect #mod-rewrite #mod-alias
Вопрос:
У меня есть текущий .htaccess
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/ $ $1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([w-] )/([w-] )/?$ index.php?apar=$1amp;bpar=$2 [L,QSA]
RewriteRule ^([w-] )/?$ index.php?apar=$1 [L,QSA]
Я хотел бы перенаправить некоторые страницы, что я обычно делаю, в соответствии со следующим:
redirect 301 /old-page https://www.domain.co.uk/new-page
Однако это, похоже, перенаправляет на страницу
https://www.domain.co.uk/new-page?apar=oldamp;bpar=page
Я не могу заставить старые страницы перенаправляться чисто.
Ответ №1:
RewriteRule
и Redirect
принадлежат разным модулям Apache (mod_rewrite и mod_alias соответственно). Следовательно, они выполняются независимо и в разное время во время запроса. mod_rewrite всегда выполняется перед mod_alias, несмотря на очевидный порядок директив в конфигурации.
По этой причине вам следует избегать смешивания директив из обоих модулей, чтобы избежать неожиданных конфликтов, подобных этому. Однако из приведенного вами примера я не совсем понимаю, откуда взялся бы этот результирующий URL-адрес, если только запрос не для /old/page
, а не /old-page
для ? (Запрос на /old-page
приведет к перенаправлению на /new-page?apar=old-page
.)
Поскольку вы уже используете mod_rewrite, вам следует использовать mod_rewrite вместо этого для этого перенаправления и включить его перед существующими директивами. Например:
RewriteRule ^old-page$ https://www.example.com/new-page [R=301,L]
Сначала протестируйте 302 (временных) перенаправления, чтобы избежать потенциальных проблем с кэшированием, и вам нужно будет очистить кэш браузера перед тестированием, так как это ошибочное 301 (постоянное) перенаправление, скорее всего, было кэшировано браузером.
В сторону:
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([w-] )/([w-] )/?$ index.php?apar=$1amp;bpar=$2 [L,QSA] RewriteRule ^([w-] )/?$ index.php?apar=$1 [L,QSA]
У вас есть проверка файловой системы ( RewriteCond
директива) перед первым правилом, но не перед вторым. (Проверка файловой системы применяется только к первому следующему правилу.)
На самом деле, эта RewriteCond
директива, вероятно, вообще не требуется, так RewriteRule
как, вероятно, она все равно не будет соответствовать реальным файлам. Если только у вас нет файлов без расширений файлов?!
Комментарии:
1. Отличный ответ! Спасибо! И вы были правы насчет /старой/страницы, а не /старой-страницы! Ты знаешь свое дело!