apache2.4 mod_rewrite исключить конкретный псевдоним directroy / uri

11

У меня есть следующие настройки на одном из моих vhosts:

...<VirtualHost *:80>
    ServerName cloud.domain.de
    ServerAdmin webmaster@domain.de
    ServerSignature Off

    Alias "/.well-known/acme-challenge" "/var/www/domain.de/vh-www/htdocs/public/.well-known/acme-challenge"

    <Directory "/var/www/domain.de/vh-www/htdocs/public/.well-known/acme-challenge">
      Require all granted
      ForceType 'text/plain'
    </Directory>

    <ifmodule mod_rewrite.c>
      RewriteEngine On
      RewriteCond %(REQUEST_URI) !/\.well\-known/acme\-challenge/?.*
      RewriteCond %{HTTPS} off
      # RewriteRule ^\.well-known/acme-challenge/([A-Za-z0-9-]+)/?$ - [L]
      RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    </ifmodule>...

Я хочу добиться того, чтобы mod_rewrite не переписывал URL при http://cloud.domain.de/.well-known/acme-challenge/обращении к URL .

Я уже пробовал разные подходы, одним из которых был закомментированный RewriteRule выше, но, похоже, ничего не работает: сервер каждый раз переписывает его в https.

Когда я отключаю перезапись для целей тестирования, я могу получить доступ к URL-адресу псевдонима ...

Как мне добиться того, чтобы конкретный URL не переписывался?

FleBeling
источник

Ответы:

16

Как это :

<ifmodule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</ifmodule>

Если URI совпадает, start with /.well-known/acme-challenge/запрос не будет перенаправлен

Froggiz
источник
Во-первых, спасибо за совет! К сожалению, это не сработало. Когда вы посещаете: http://www.server-plant.de/.well-known/acme-challenge/это все еще переписывается. (Я применил те же правила и условия переписывания для моего www-субдомена, поэтому он точно такой же, как и облачный-субдомен)
FleBeling,
Отредактировано: было {) вместо {} и RewriteCond %{HTTPS} offне
требуется
Да, я просто слепо скопировал твои, не проверяя правильные скобки, но хорошо, ш .. бывает :) Теперь это работает как обаяние, и ты также прав в отношении другого условия. Остался только один вопрос: как изменить условие, чтобы оно соответствовало всему, что стоит за трейлингом /? Так что не поймать index.html и так далее?
FleBeling
это уже соответствует всем, start with /.well-known/acme-challenge/что означает /.well-known/acme-challenge/anything, что перенаправление тоже не будет
Froggiz
1
Конфигурации переписывания могут быть унаследованы для всех виртуальных хостов, RewriteOptions InheritDownначиная с Apache 2.4.8. RewriteEngine Onдолжен присутствовать в каждой конфигурации виртуального хоста.
тоблтобс
3

@mark Правильная версия «более короткого и надежного» варианта:

RewriteCond %{REQUEST_URI} ^/\.well\-known
RewriteRule . - [L]
отдаленный разум
источник
добавить это, чтобы остановить правила перенаправления ssl ниже, это здорово
Джеймс Тан
Единственная точка в строке 2 не работает для меня. Это потому, что он соответствует только одному символу, а URL состоит из нескольких символов? Я использую ^ (. *) $ Вместо.
Джетт
0

ИМХО короче и надежнее

RewriteCond %{REQUEST_URI} ^\.well\-known
RewriteRule - [L]

вы можете добавить / acme-challenge / в конце концов, но если вы хотите отладить его с помощью произвольного файла, например ./well-known/test, это решение работает лучше

что он на самом деле делает: смотрит, начинается ли запрос с .well-known, в этом случае ничего не делает (значение -) и делает его последним правилом [L]

Марк Хофстеттер
источник
Неа. Кажется, что виртуальные хосты имеют приоритет. «Разделы внутри <VirtualHost> разделов применяются после соответствующих разделов вне определения виртуального хоста. Это позволяет виртуальным хостам переопределять конфигурацию основного сервера». с httpd.apache.org/docs/current/sections.html
Фредерик Норд,