#.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, не хотел много изменений туда и обратно.