Назад | Перейти на главную страницу

Сделайте исключение из правила RedirectMatch для всего сайта

У нас есть это правило RedirectMatch для перемещения клиентов на сайт с поддержкой SSL, сохраняя путь, к которому они пытаются получить доступ:

Redirectmatch permanent (.*) https://www.foobar.com$1

и он отлично работает. Теперь мы хотели бы добавить исключение для / somepath, которое должно не быть перенаправленным. Как я могу это сделать?

С помощью mod_rewrite я бы добавил rewriterule, говорящее «не переписывать и прекращать сопоставление», но такого механизма с перенаправлением нет. Кроме того, если я тривиально переверну регулярное выражение, например! (/ Somepath | / someotherpath), он больше не получит параметр $ 1.

По какой причине вы не хотите использовать mod_rewrite?

Вы можете имитировать функциональность с помощью этого:

RewriteCond  %{REQUEST_URI}  !^/(somepath|someotherpath)
RewriteRule  (.*)                       $1                        [R=permanent]
RewriteRule  http://%{SERVER_NAME}(.*)  https://www.foobar.com$1  [L]

Я не понимал, что Apache использует PCRE. Поскольку это так, вы можете делать то, что хотите, с помощью mod_alias:

RedirectMatch permanent ^/?((?!(thisisfoo|thisisbar)).*) https://www.foobar.com/$1

где / thisisfoo и / thisisbar - исключения из перенаправления.

Согласно документации (на http://httpd.apache.org/docs/2.2/mod/mod_alias.html#order), Redirects обрабатываются в том порядке, в котором они встречаются. Итак, вы хотели бы сначала поставить более ограничительное правило, а затем - всеобъемлющее правило в конце.