Правило автоматической перезаписи документа об ошибке Apache

#.htaccess #mod-rewrite

Вопрос:

Мне нравится упрощать код, если это возможно, но я не знаком с .htaccess, у меня было жестко закодированное правило перенаправления документов с ошибками

 ErrorDocument 403 http://example.com/error/404
 

Потом я сделал это

 ErrorDocument 403 http://%{HTTP_HOST}/error/404
 

мой вопрос в том, чтобы .htaccess не нужно было изменять вручную, есть ли способ определить, является ли он https или http? потому что в приведенном выше примере, если я использую https, мне придется жестко кодировать https, который я хотел бы проверить автоматически.

Ответ №1:

Не используйте абсолютный URL-адрес в ErrorDocument директиве

 ErrorDocument 403 http://example.com/error/404
 

Для начала вам не следует использовать абсолютный URL-адрес в ErrorDocument директиве! Это вызовет ответ 302 (т. е. временное перенаправление 302) на целевой URL-адрес. Таким образом, это не приведет к отправке ответа 403 (или 404) обратно агенту пользователя при первом ответе.

(Этот формат ErrorDocument директивы следует использовать только в очень исключительных обстоятельствах, так как вы также теряете много информации об URL-адресе, который вызвал ответ в первую очередь.)

Чтобы внутренне обслуживать пользовательский документ об ошибке на том же сервере, это должен быть URL-адрес, связанный с корнем, начинающийся с косой черты (без схемы или имени хоста). Например:

 ErrorDocument 403 /error/404
 

Однако /error/404 это вряд ли будет действительной конечной точкой. Это должно представлять действительный ресурс, который можно обслуживать. например. /error/404.html .

(И это, естественно, решает проблему необходимости указывать HTTP вместо HTTPS.)


Чтобы ответить на ваш конкретный вопрос…

потому что в приведенном выше примере, если я использую https, мне придется жестко кодировать https

(Хотя, возможно, в наши дни вам следует везде использовать HTTPS.)

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

 ErrorDocument 403 %{REQUEST_SCHEME}://%{HTTP_HOST}/error/404
 

Или, если REQUEST_SCHEME переменная сервера недоступна, вы можете создать ее из HTTPS переменной сервера, используя mod_rewrite, и назначить ее переменной среды. Например:

 RewriteEngine On
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ - [E=PROTO:http%1]

ErrorDocument 403 %{reqenv:PROTO}://%{HTTP_HOST}/error/404
 

%1 Обратная ссылка содержит s , когда HTTPS есть on , и в противном случае пуста. Таким образом, переменная PROTO среды имеет значение или http или https .

Это предполагает, что SSL управляется сервером приложений, а не прокси-сервером переднего плана (например, гибкий SSL Cloudflare и т. Д.).

Комментарии:

1. спасибо, я работаю над локальным хостом, не настроенным для ssl, живой сервер-это ssl, не хотел много изменений туда и обратно.