Htaccess - несколько правил в одном файле - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь сделать две вещи с моим .htaccess файлом.

  1. Чтобы перенаправить на HTTPS (SSL) сервер
  2. Чтобы настроить мою пользовательскую ошибку 404 стр.

Это то, что я получил до сих пор:

RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^(.*)$ https://www.example.co.uk/$1 [R=301,L]

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /404.html
ErrorDocument 404 /404.html

Можно ли иметь там RewriteEngine On дважды?

Обратите внимание, что последняя часть Скрипт был получен из следующей статьи, так как я использую их серверы веб-хостинга: https://www.ionos.co.uk/help/hosting/html-and-css/create-your-own-error-pages-linux-webhosting

1 Ответ

2 голосов
/ 18 февраля 2020

Это нормально, что RewriteEngine On там дважды?

Это "ОК", но вам это не нужно, и вам лучше только включить его один раз на начало вашего файла.

Если у вас несколько директив RewriteEngine, тогда last one выигрывает и контролирует всю область действия / файл. например. Если вы включите RewriteEngine Off в самом конце файла, тогда он отключит механизм перезаписи для всего файла, несмотря на предыдущие директивы RewriteEngine On.

RewriteCond %{SERVER_PORT} !=443
RewriteRule ^(.*)$ https://www.[MY URL].co.uk/$1 [R=301,L]

Это нормально в качестве перенаправления HTTP на HTTPS, при условии, что сертификат SSL устанавливается непосредственно на сервер приложений. Имейте в виду, что конфигурации сервера могут быть разными, и, следовательно, могут иметь разные требования в отношении перенаправления HTTP на HTTPS (в какой части объясняется, почему в inte rnet вы видите различные варианты директив). И есть также несколько способов сделать то же самое.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /404.html
ErrorDocument 404 /404.html

Вы "вроде" делаете то же самое здесь с mod_rewrite (RewriteCond и RewriteRule) и директива ErrorDocument. Вы должны определить свой пользовательский документ об ошибках с помощью директивы ErrorDocument, а не mod_rewrite.

Директивы mod_rewrite внутренне переписывают запрос на /404.html после выполнения нескольких проверок файловой системы (что запрос не сопоставляется с директория или файл).

Директива ErrorDocument указывает Apache обслуживать этот документ (через внутренний подзапрос), когда он в противном случае вызовет 404.

Директивы mod_rewrite переопределяют ErrorDocument, так как они обрабатываются ранее в запросе (хотя это не имеет никакого отношения к порядку директив в файле).

RewriteBase /

Эта директива не применяется используется здесь и может быть удален. Директива RewriteBase (часть mod_rewrite) устанавливает префикс каталога, используемый для замены относительного пути. В настоящее время у вас нет относительных подстановок пути в вашем конфигурационном файле.

Итак, другими словами, ваш файл должен быть записан так:

RewriteEngine On

ErrorDocument 404 /404.html

# HTTP to HTTPS redirect
RewriteCond %{SERVER_PORT} !=443
RewriteRule (.*) https://www.example.co.uk/$1 [R=301,L]

Порядок этих директив делает не имеет особого значения, хотя более логично логично определять пользовательские документы об ошибках в верхней части файла.

Обратите внимание, что последняя часть скрипта была получена из следующая статья

Ну, эта статья "неправильная". Это не вызовет «ошибку», но может привести к нежелательным результатам в дальнейшем. В лучшем случае это просто вводит в заблуждение и «раздутый». (Например ... почему они захватывают обратную ссылку в шаблоне RewriteRule ? Почему нет флага L? И, как уже упоминалось, почему они устанавливают RewriteBase? Et c. )

К сожалению, что касается .htaccess (и особенно mod_rewrite), там много неверной информации!

...