В чем разница между HTTP_HOST и HTTPS_HOST в файлах apache .htaccess?

Я редактирую файл .htaccess ..

В RewriteCondition для RewriteRules HTTPS_HOST кажется, соответствуют только URL-адресам, доступ к которым осуществляется по протоколу https: // (ssl). Я где-то видел в документации, что это переменная T / F, которая указывает, был ли доступ к URL-адресу с использованием безопасного протокола.

Однако у меня возникают проблемы с поиском в документации, соответствует ли HTTP_HOST только ] http: // протоколы, или если он фактически соответствует // относительным протоколам, то есть соответствует обоим http: // и https: / / .

Может ли кто-нибудь подтвердить тот или иной способ или указать мне точный источник этой информации?

Кроме того, если HTTP_HOST соответствует обоим протоколам варианты, как лучше всего отфильтровать совпадения только http: // протоколов?

Пример:

<IfModule mod_rewrite.c>
RewriteEngine on
Rewritecond %{HTTP_HOST} ^\/\.(?!some-url).*$
RewriteRule (.*) https://www.example.com/$1 [R=301,L,NC]
</IfModule>

Для сравнения:

...
Rewritecond %{HTTPS_HOST} ^\/\.(?!some-url).*$
...

Изменить: Эксперименты показывают, что HTTP_HOST соответствует ли обоим протоколам, тогда как HTTPS_HOST соответствует только тогда, когда протокол или URL-адрес начинается с https: // .

.

. (Примечание относительно: [11 113699] apache2 тег
ТБХ, я не уверен, какую версию apache я использую. Чтобы попытаться выяснить, чтобы я мог прикрепить правильный тег ..
Я пробовал httpd -v , apache -v , apache2ctl -S , apachectl -S , httpd -S ] и т. д. (Это не вопрос виртуального хоста, и у меня есть nginx, который, как мне кажется, в любом случае предназначен для этого (виртуального сервера), но я все равно пробовал эти последние 3 команды (виртуальный хост), чтобы увидеть, могут ли они просветить меня о моей версии apache ).
Ответы на эти команды говорят, что сначала я должен установить apache2,или это неизвестная команда.
У меня есть папка / etc / apache2 , но нет папки / usr / local / apache (следовательно, нет папки / usr / local / apache / bin / httpd ).
)

1
задан 9 February 2019 в 07:43
1 ответ

Нет такой переменной сервера Apache HTTPS_HOST, есть только HTTP_HOST. Если HTTPS_HOST установлен на вашем сервере, то это специфично для вашего сервера.

Серверная переменная HTTP_HOST содержит значение заголовка запроса HTTP Host (т.е. hostname), это независимо от используемого протокола (HTTP или HTTPS). Как и все переменные, которые запускают HTTP_, они содержат значение соответствующего заголовка HTTP-запроса.

Может быть, вы думаете о переменной HTTPS Apache-сервера? Она содержит значение on или off в зависимости от того, находится ли запрос поверх HTTPS или нет. Итак, если у вас нет внешнего прокси, который управляет SSL, то это переменная сервера HTTPS, которую вы используете, чтобы определить, осуществляется ли запрос по протоколу HTTP или HTTPS.

Справка:

и у меня nginx

Итак, для чего вы используете Nginx? Это ваш сервер приложений? Или вы используете его в качестве front-end прокси? В этом случае, HTTPS в конце концов, возможно, не та переменная, которую следует использовать.


UPDATE:

Rewritecond %{HTTP_HOST} ^\/\.(?!some-url).*$
RewriteRule (.*) https://www.example.com/$1 [R=301,L,NC]

В этом нет никакого смысла. Директива condition (RewriteCond) никогда не будет успешной, поэтому редирект никогда не произойдёт никогда.

Как упоминалось выше, переменная сервера HTTP_HOST содержит только имя хоста, например example.com или www.example.com. Она не содержит URL-путь, как вы предполагаете здесь. Ваше условие пытается соответствовать буквальному /.. , а не , за которым следует some-url (используя отрицательный взгляд). Имя хоста / никогда не будет начинаться со слеша (или даже содержать), поэтому при первом символе не удается.

Я пытаюсь изменить правило htaccess, которое блокировало обновление letsencrypt, ..... Итак, есть основная проблема (.известный получил 403)

Чтобы сделать исключение для конкретного URL-пути, вы должны сделать что-то вроде следующего:

Rewritecond %{REQUEST_URI} !^/\.well-known
RewriteRule (.*) https://www.example.com/$1 [R=301,L,NC]

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

Однако, вы заявляете, что ".known получал 403" - вам может понадобиться выяснить, что вызывало 403, и применить исключение к этому правилу.

ИЛИ включите единственное исключение в самом верху вашего .htaccess файла:

# Any requests that start "/.well-known" are ignored
RewriteRule ^\.well-known - [L]

(Обратите внимание на отсутствие префикса косой черты на шаблоне RewriteRule pattern, который совпадает с URL-путем.)

Изначально (а может быть и сейчас) я подумал, что требование https к просроченному сертификату может быть проблемой.

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

.
3
ответ дан 3 December 2019 в 18:24

Теги

Похожие вопросы