Как отключить перенаправление .htaccess для определенной папки

Как отключить перенаправление .htaccess для определенной папки

Я пишу следующие .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)

Связанный контент