.htaccess перенаправление нескольких поддоменов в папку с помощью флага END - PullRequest
0 голосов
/ 24 января 2019

Я настраиваю веб-сайт для пользователя, и стало очевидно, что у него есть множество поддоменов, которые ранее были направлены в определенные папки. Я предпочел бы найти способ, которым они могут управлять этим сами, создавая соответствующие каталоги, а не продолжать добавлять виртуальные хосты или изменять правила .htaccess каждый раз, когда они хотят добавить / изменить их.

В связи с этим мне пришла в голову идея использовать универсальный vhost и использовать .htaccess, чтобы направить поддомен в нужную папку.

Теперь я знаю, что подобные вопросы задавались, но я пытаюсь добиться этого с помощью одного набора правил и без полного перенаправления HTTP.

В настоящее время у меня есть следующие правила, но у меня странная проблема

RewriteCond %{REQUEST_URI} !^/\.well-known
RewriteCond %{HTTP_HOST} !=www.example.co.uk [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.example\.co\.uk [NC]
RewriteRule ^(.*)$ /%1/$1 [L,END,QSA]

По сути, идея состоит в том, чтобы избежать .well-known, чтобы LetsEncrypt мог использовать корень документа для получения сертификатов для любого поддомена, избегать www., который должен использовать стандартный путь, но затем сопоставлять и перенаправлять любой другой поддомен.

Без END это, как и ожидалось, заканчивается ошибкой сервера и сообщением exceeded the limit of 10 internal redirects в журнале. Это, по крайней мере, подтверждает, что оно соответствует и перенаправляет.

Однако при использовании ключевого слова END, насколько я понимаю, перезапись должна происходить только один раз; Хотя я вижу странное поведение.

Для определенного пути вроде бы нормально работает

GET /index.html HTTP/1.1
Host: journey.example.co.uk

HTTP/1.1 200 OK
... snip content from /journey/index.html ...

Но если я не даю путь, кажется, что он обрабатывает перенаправление дважды.

GET / HTTP/1.1
Host: journey.example.co.uk

HTTP/1.1 404 Not Found

... snip ...
<p>The requested URL /journey/journey/index.html was not found on this server
... snip ...

Учитывая использование %1, которое должно быть первой частью имени хоста, $1, которое в данном случае должно быть либо просто /, либо пустым, я не вижу, как это заканчивается journey дважды в переписанном пути.

1 Ответ

0 голосов
/ 24 января 2019

Думаю, я мог бы добиться этого самостоятельно, просмотрев документацию по флагам перезаписи в 10-й раз и найдя ее.

nosubreq|NS Causes a rule to be skipped if the current request is an internal sub-request.

В дальнейшей документации рассказывается о SSI, который не имеет отношения к моемупроблема, но она продолжает упоминать следующее:

Also, when mod_dir tries to find out information about possible directory default files (such as index.html files), this is an internal subrequest, and you often want to avoid rewrites on such subrequests

Насколько я понимаю, запрос на / заставляет mod_dir сделать подзапрос для index.html, что приводит к двум запросам,и два переписывают.

Добавление указанного выше флага в правило, кажется, работает, по крайней мере, в нескольких быстрых тестах.Таким образом, следующие правила позволяют перенаправлять любой поддомен в каталог с тем же именем в корневом каталоге документа.

RewriteCond %{REQUEST_URI} !^/\.well-known
RewriteCond %{HTTP_HOST} !=www.example.co.uk [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.example\.co\.uk [NC]
RewriteRule ^(.*)$ /%1/$1 [END,NS]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...