Я настраиваю веб-сайт для пользователя, и стало очевидно, что у него есть множество поддоменов, которые ранее были направлены в определенные папки. Я предпочел бы найти способ, которым они могут управлять этим сами, создавая соответствующие каталоги, а не продолжать добавлять виртуальные хосты или изменять правила .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
дважды в переписанном пути.