Переписывание и перенаправление не работают вместе

#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. Отличный ответ! Спасибо! И вы были правы насчет /старой/страницы, а не /старой-страницы! Ты знаешь свое дело!