.htaccess переписать содержимое в подпапку - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть следующая структура папок на моем веб-сервере:

Folder structure

Мне нужны некоторые правила перезаписи:

  1. При посещении http://testdomain1.com/ мне нужно установить /pages/testdomain1.com/ в качестве корневого каталога для отображения содержимого из этого каталога.

    Аналогично, корневая папка http://testdomain2.com/ имеет значение /pages/testdomain2.com/ и т. Д.

  2. Когда запрошенный URL-адрес содержит la var - мне нужно переписать в целевой каталог.

    Пример: http://testdomain1.com/?la=template1 - установить /lands/template1/ в качестве корневого каталога

У меня возникла проблема с моим текущим .htaccess (для первого задания):

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?testdomain1.com$
RewriteRule ^(/)?$ pages/%{HTTP_HOST}/index.html [L]

Правило перезаписи работает, но все данные ресурсов (js, css) не работают (404 не найдено).Как я могу установить правильные правила?

1 Ответ

0 голосов
/ 21 декабря 2018

... но все данные об активах (js, css) не работают (404 не найдено).Как я могу установить правильные правила?

Это, скорее всего, вызвано использованием относительных URL-путей к вашим ресурсам.Вам нужно «исправить» ваши URL-пути, чтобы они были относительными или относительными.Это не то, что должно быть исправлено в .htaccess, иначе вы переписываете все в порядке.

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

RewriteCond %{HTTP_HOST} ^(www.)?testdomain1.com$
RewriteRule ^(/)?$ pages/%{HTTP_HOST}/index.html [L]

Это только перезаписывает запросы для корня, т.е.testdomain1.com/.И не testdomain1.com/foo - это намеренно?

Мне нужен доступ к любой странице (example.com/page.html), не только index.html.

Если к этомуВы имеете в виду, что запрос формы http://testdomain1.com/foo должен быть переписан на /pages/testdomain1.com/foo, тогда вам нужно будет изменить вышеприведенное на что-то вроде следующего:

RewriteCond %{QUERY_STRING} !^la=[\w-]+
RewriteCond %{HTTP_HOST} ^(?:www.)?(testdomain1\.com)$
RewriteRule !^pages/ pages/%1%{REQUEST_URI} [L]

Обратите внимание, что это переписывает все, включая CSS, JS и изображения.

Первое условие (директива RewriteCond) исключает URL-адреса, содержащие параметр URL la.(Эти URL обрабатываются ниже.)

Это также исправляет ошибку в существующей директиве, в результате которой запрос на субдомен www (например, www.testdomain1.com) привел бы к неправильной перезаписи.Обратная ссылка %1 в строке substitution содержит запрашиваемый домен, за исключением необязательного поддомен www.(Я предполагаю, что у вас нет подкаталога www.testdomain1.com?) Хотя, возможно, вы уже должны канонизировать www / non-www ранее в файле конфигурации.

(Не забудьте экранировать буквальные точки.)

ОБНОВЛЕНИЕ:

Я пытался использовать этот случай для нескольких доменов, а не только для testdomain1.com.Так что мне нужно изменить RewriteCond %{HTTP_HOST} ^(www.)?testdomain1.com$ часть.Я только что попробовал RewriteCond %{REQUEST_URI}, но не работает.

Для нескольких доменов вы можете либо:

  • Дублировать блок кода выше для каждого домена иизмените домен testdomain1.com во втором условии.

  • Если это относится только к 3 доменам, вы можете использовать чередование во втором условии, чтобы соответствовать любому из3 домена.Например:

    RewriteCond %{HTTP_HOST} ^(?:www.)?(testdomain1\.com|testdomain2\.com|testdomain3\.com)$
    
  • Если это применимо к любому домену, сделайте регулярное выражение более общим, чтобы соответствовать любому домену.Например:

    RewriteCond %{HTTP_HOST} ^(?:www.)?([a-z0-9.-]+?)\.?$
    

2) Когда URL-адрес запроса имеет "la" var - мне нужно переписать в каталог земли.
Пример: http://testdomain1.com/?la=template1 - set /lands/template1/ как root dir

Как уже упоминалось в моем комментарии, вам, вероятно, не следует переписывать каталог.Это не каталог, который обрабатывает запрос, а в конечном итоге файл.Переписывая в каталог, я предполагаю, что вы полагаетесь на то, что mod_dir создает внутренний подзапрос для документа индекса каталога (как указано в директиве DirectoryIndex).В этом примере я предположу, что индекс каталога равен index.php.

. Для этого потребуется перейти на до переписанного выше кода, поскольку он более конкретен:

RewriteCond %{QUERY_STRING} ^la=([\w-]+)
RewriteRule ^$ /lands/%1/index.php [L]

%1 (в отличие от $1) - это обратная ссылка на захваченный шаблон в последнем сопоставленном CondPattern .Регулярное выражение [\w-]+ ограничивает значение параметра la символами 0-9, a-z, A-Z, _ и -.Параметр la также должен быть первым параметром URL.

...