Я редактирую файл .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
).
)
Нет такой переменной сервера 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 о том, что сертификат недействителен и запрос никогда не достигнет вашего сервера.
.