Ключевым вопросом здесь является понимание разницы между перенаправлением и перезаписью . Короче говоря, перенаправление происходит на стороне клиента, меняя URL в браузере. Перезапись происходит на стороне сервера и прозрачна для браузера / клиента.
Примером перенаправления может быть изменение протокола с http://
на https://
или добавление или удаление субдомена www
.
Примером перезаписи будет получение пути, подобного /foo-bar-bas
, и перед отправкой его будет обработано сервером (через ASP, Python, php, ruby on rails, node.js и т. Д.), переписать его как article.aspx?name=foo_bar_bar
или что-то подобное.
Вы можете видеть в ОП выше, перенаправление с http://
на https://
, когда оно находилось в верхней части блока правил, было коротким замыканием перезаписей под ним из-за следующих двух флагов:
R=301
, который сообщает браузеру: «этот (A) ресурс перемещен, теперь он находится в этом (B) месте»
L
, который сообщает Apache, «прекратить обработку набора правил».
- Третий флаг
NC
означает игнорирование регистра, а /?(.*)
в любом случае не учитывает регистр.
Все, что нужно, это:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1
RewriteCond %{REQUEST_URI} ^/foobar
RewriteRule ^foobar/(bat.*)$ /foo/$1 [L,R=301]
RewriteRule ^foobar/(bas.*)$ /foo/$1 [L,R=301]
</IfModule>
Часть того, что сбивает с толку, заключается в том, что мы используем правило «Переписать» для достижения «Перенаправления» (а также переписывания под ним). Apache также поддерживает директиву Redirect вне mod_rewrite
модуль. Я не уверен, что это сработает здесь.
Стоит повторить @ комментарий Ultimater сверху о том, что при тестировании , используя 302 найденный код состояния в отличие от 301 навсегда перемещен код состояния с флагом R
предотвратит отправку неправильного сообщения веб-сканерам или (возможно, вашим) браузерам.