Как создать следующие правила в .htaccess? Перезапись мода включена. Но у меня проблемы.
Я хочу, чтобы каждое из правил в каждом случае (1) и (2) применялось к доменам, подпадающим под это правило.
Currently all domains point to /public_html/. The .htaccess file is in /public_html/.htaccess.
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
1. Set /public_html/web/ as root path!
2. Redirect always to https://www, keep URL and parameters!
domain1.com
domain2.com
domain3.com
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
1. Set /public_html/live/ as root path!
2. Redirect always everything to https://www.domain4.net, keep URL and parameters!
domain4.net
domain5.com
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
1. Set /public_html/staging/ as root path!
2. Redirect always everything to https://www.domain6.com, keep URL and parameters!
domain6.com
domain7.com
domain8.com
domain9.com
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
1. Keep /public_html/ as root path!
2. Redirect always everything to https://www.domain10.com, keep URL and parameters!
domain10.com
domain11.com
domain12.com
Когда я пытаюсь решить следующее:
RewriteCond %{HTTP_HOST} ^domain1.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www.domain1.com$
RewriteCond %{REQUEST_URI} !web/
RewriteRule (.*) /web/$1 [L]
RewriteCond %{HTTP_HOST} ^domain1.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.domain1.com [NC]
RewriteRule ^(.*)$ https://www.domain1.com/$1 [L,R=302,NC]
При каждом обращении к URL-адресу отображается подпапка в URL-адресе, чего я не хочу!
Я нашел следующее на сайте: https://www.siteground.com/kb/how_to_change_my_document_root_folder_using_an_htaccess_file/
RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain-name.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www.domain-name.com$
RewriteCond %{REQUEST_URI} !folder/
RewriteRule (.*) /folder/$1 [L]
и попытался просто изменить это следующим образом:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain-name.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www.domain-name.com$
RewriteCond %{REQUEST_URI} !folder/
RewriteRule (.*) https://www.domain1.com/folder/$1 [L]
Но это также показывает подпапку в URL-адресе.
Несколько комментариев по поводу ваших попыток ...
RewriteCond %{HTTP_HOST} ^domain1.com$ [NC,OR] RewriteCond %{HTTP_HOST} ^www.domain1.com$ RewriteCond %{REQUEST_URI} !web/ RewriteRule (.*) /web/$1 [L] RewriteCond %{HTTP_HOST} ^domain1.com [NC,OR] RewriteCond %{HTTP_HOST} ^www.domain1.com [NC] RewriteRule ^(.*)$ https://www.domain1.com/$1 [L,R=302,NC]
Эти директивы расположены в неправильном порядке. В перенаправить нужно идти первым, чтобы предотвратить /web
подкаталог открыт. Однако в его текущем воплощении это привело бы к циклу перенаправления, поскольку он просто перенаправляет на себя снова и снова ... (я думаю, может быть, приведенный в качестве примера код представил этот «цикл перенаправления»?).
RewriteEngine on RewriteCond %{HTTP_HOST} ^domain-name.com$ [NC,OR] RewriteCond %{HTTP_HOST} ^www.domain-name.com$ RewriteCond %{REQUEST_URI} !folder/ RewriteRule (.*) https://www.domain1.com/folder/$1 [L]
Перезапись на абсолютный URL (то есть со схемой + именем хоста) неявно вызовет внешнее перенаправление и, следовательно, откроет «скрытый» подкаталог. Вам нужно сохранить редирект (на www.domain1.com
) и переписать на /folder
как отдельные правила - это две разные задачи.
Моя первая мысль - рассматривать это как одну систему. Сначала все перенаправления, а затем перезаписи. Я обработаю перенаправление на www
как общий случай, поэтому я включу это в последнюю очередь.
NB: сначала протестируйте с 302 (временными) перенаправлениями, чтобы избежать потенциальных проблем с кешированием, и измените их на 301 (постоянное) только после того, как убедитесь, что все работает нормально.
Например:
RewriteEngine On
#
# CANONICAL REDIRECTS
#
# Canonicalise www.domain4.net
RewriteCond %{HTTP_HOST} ^domain4\.net [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.)?domain5\.com [NC]
RewriteRule ^ https://www.domain4.net%{REQUEST_URI} [R=301,L]
# Canonicalise www.domain6.com
RewriteCond %{HTTP_HOST} ^domain6\.com [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.)?domain7\.com [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.)?domain8\.com [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.)?domain9\.com [NC]
RewriteRule ^ https://www.domain6.com%{REQUEST_URI} [R=301,L]
# Canonicalise www.domain10.com
RewriteCond %{HTTP_HOST} ^domain10\.com [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.)?domain11\.com [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.)?domain12\.com [NC]
RewriteRule ^ https://www.domain10.com%{REQUEST_URI} [R=301,L]
# Redirect to www subdomain all other domains
# NB: If you have other domains that shouldn't be redirected OR other subdomains
# then you will need to explicitly check the hostnames as above.
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
#
# INTERNAL REWRITES
# NB: Since the request has already been canonicalised (above)
# We only need to check the canonical hostnames below.
#
# Rewrite to /live
RewriteCond %{HTTP_HOST} ^www\.domain4\.net
RewriteRule !live/ /live%{REQUEST_URI} [L]
# Rewrite to /staging
RewriteCond %{HTTP_HOST} ^www\.domain6\.com
RewriteRule !staging/ /staging%{REQUEST_URI} [L]
# Rewrite to /web
RewriteCond %{HTTP_HOST} ^www\.domain1\.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www\.domain2\.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www\.domain3\.com [NC]
RewriteRule !web/ /web%{REQUEST_URI} [L]
# Keep root as the document root for all remaining domains...
Это предполагает, что вы уже обрабатываете перенаправление HTTP на HTTPS в другом месте вашей конфигурации (желательно перед эти директивы).
Однако это не обязательно завершено, поскольку пользователь все еще может получить доступ к /web
, /live
или /staging
подкаталоги напрямую (для любой домен), если они известны. Вероятно, это не проблема, если это новая система, в которой эти подкаталоги еще не открыты. При необходимости могут быть реализованы дополнительные перенаправления, чтобы канонизировать это. Хотя, если у вас есть дополнительные .htaccess
файлы в этих подкаталогах, тогда это перенаправление необходимо будет включить в подкаталог .htaccess
файл вместо этого.
Чтобы уточнить, это не "меняет корень документа папка "- это возможно только путем изменения конфигурации сервера. Это просто перезапись URL, которая скрывает подкаталог. Приложение по-прежнему видит корень документа, как определено конфигурацией сервера, т.е. /public_html/
.
ОБНОВИТЬ:
Если у вас еще нет общего перенаправления HTTP на HTTPS, вам следует добавить отдельное перенаправление вверху .htaccess
файл. Например:
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Это перенаправляет с HTTP на HTTPS. на том же хосте (что на самом деле является требованием, если вы когда-нибудь реализуете HSTS). Следующие перенаправления канонизируют www
поддомен по мере необходимости.
Если у вас нет намерения внедрять HSTS, вы можете объединить перенаправления HTTP на HTTPS и без www на www в один. А потом удалять не-www на www, который в настоящее время находится в конце блока перенаправления. Например:
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+) [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L]