Перенаправить схему на https и перейти к правилам пути - PullRequest
1 голос
/ 21 марта 2019

В нашем файле .htaccess есть несколько правил перезаписи на основе пути.Например, если URI указывает на /foobar/somestring перенаправление на страницу /foo/somestring, но мы также хотим принудительно загрузить ресурс через https.

Мы можем включить https://%{HTTP_HOST} во все RewriteRules, с более конкретными URI, адресованными первыми, но я почти уверен, что в этом нет необходимости.

Я просмотрел apache flags docs , но мне трудно найтиспособ заставить сервер обращаться к scheme одним способом и продолжить чтение правил и условий для адреса paths.

Это длинный подход, который мы используем сейчас:

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteBase /
  RewriteCond %{REQUEST_URI}  ^/foo
  # Long list
  RewriteRule ^foobar/(bat.*)$ https://%{HTTP_HOST}/foo/$1 [L,R=301]
  RewriteRule ^foobar/(bas.*)$ https://%{HTTP_HOST}/foo/$1 [L,R=301]
  # URI not found
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^ https://%{HTTP_HOST}/index.php [L]
  # And finally
  RewriteCond %{HTTPS} !=on
  RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L,NC]
</IfModule>

Большое спасибо.

1 Ответ

1 голос
/ 22 марта 2019

Ключевым вопросом здесь является понимание разницы между перенаправлением и перезаписью . Короче говоря, перенаправление происходит на стороне клиента, меняя 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 предотвратит отправку неправильного сообщения веб-сканерам или (возможно, вашим) браузерам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...