Я пишу следующие .htaccess
правила для перенаправления всех URL-адресов с www.a.com
на www.b.com
:
RewriteEngine on
RewriteCond %{http_host} ^www.a.com [NC,OR]
RewriteCond %{http_host} ^a.com [NC]
RewriteRule ^(.*)$ https://www.b.com/myfolder/ [R=301,NC,L]
Теперь в подкаталоге есть файл a.com
, как показано ниже:
www.a.com/.well-known/acme-challenge/#######
Он используется для обновления AutoSSL. С указанным выше перенаправлением AutoSSL больше не сможет найти файл, поэтому обновление не будет выполнено.
Итак, возможно ли отключить перенаправление в разделе /.well-known/acme-challenge/
?
решение1
Поскольку вы перенаправляете все на фиксированный URL-путь, вы можете также создать исключение непосредственно в RewriteRule
директиве (нет необходимости захватывать URL-путь, как вы делаете сейчас).
Например:
RewriteCond %{HTTP_HOST} ^(www\.)?a\.com [NC]
RewriteRule !^\.well-known/acme-challenge/ https://www.b.com/myfolder/ [R=301,L]
Префикс !
наRewriteRule
шаблонотрицает выражение, поэтому оно успешно, когда регулярное выражениенетсовпадение. В этом случае, когда запрошенный URL-путь не начинается .well-known/acme-challenge/
. (Однако см. «пограничный случай» ниже.)
Я также объединил ваши дваусловия( RewriteCond
директивы) в одно. Нет необходимости в NC
флаге самого правила (предполагая, что вы используете Linux, а не Windows).
Не забудьте экранировать точки в регулярном выражении с помощью обратного слеша.
Крайний случай (опциональная опция)
Обратите внимание, что если у вас также есть шаблон фронт-контроллера далее в .htaccess
файле (например, WordPress, Joomla, большинство других фреймворков/CMS и т. д.), то вам также следует добавитьсостояниек вышеуказанному правилу, чтобы предотвратить перезаписи на фронт-контроллер, перенаправленный при запросе URL-адреса формы /.well-known/acme-challenge/<non-existent-file>
. Например:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
:
Без этого условия запрос на http://a.com/.well-known/acme-challenge/<non-existent-file>
был бы перенаправлен на https://www.b.com/index.php
(предполагая, index.php
что это фронт-контроллер).
Краткое содержание
Полное правило тогда будет выглядеть так:
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} ^(www\.)?a\.com [NC]
RewriteRule !^\.well-known/acme-challenge/ https://www.b.com/myfolder/ [R=301,L]
# Front-controller pattern follows...
ОБНОВЛЯТЬ:
если перенаправление представляет собой простую строку:
redirect 301 / https://www.b.com/myfolder/
, как написать исключение для/.well-known/acme-challenge/
?
Так какпростой Redirect
Директива (mod_alias) сама по себе не предоставляет возможности делать «исключения», вам нужно будет заключить директиву в выражение <If>
(требуется Apache 2.4). Например:
<If "%{REQUEST_URI} !~ m#^/\.well-known/acme-challenge/#">
Redirect 301 / https://www.b.com/myfolder/
</If>
Ссылка:https://httpd.apache.org/docs/2.4/expr.html
(Если вы используете Redirect
директиву таким образом, то нет шаблона «фронт-контроллер» и нет «пограничного случая», упомянутых выше.)
В стороне:Хотя они могут выглядеть похожими, эта Redirect
директива существенно отличается от RewriteRule
директивы, использованной ранее, и дает другие результаты. Директива RewriteRule
вышесбрасываетзапрошенный URL-путь, перенаправляя все на https://www.b.com/myfolder/
. Однако Redirect
директива, используемая здесьсохраняетзапрошенный URL-путь, с префиксом URL-пути /myfolder
(например, /foo/bar
перенаправлен на https://www.b.com/myfolder/foo/bar
)