У нас есть это правило 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), Redirect
s обрабатываются в том порядке, в котором они встречаются. Итак, вы хотели бы сначала поставить более ограничительное правило, а затем - всеобъемлющее правило в конце.