Как создать следующие правила в .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} ^домен1.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]
Эти директивы не в том порядке. Редирект redirect должен идти первым, чтобы предотвратить раскрытие поддиректории /web
. Однако, в его текущем воплощении это приведет к циклу перенаправления, так как он просто будет снова и снова перенаправлять на себя.... (Наверное, примерный код ввел этот "цикл перенаправления"?).
RewriteEngine on RewriteCond %{HTTP_HOST} ^домен-name.com$ [NC,OR] RewriteCond %{HTTP_HOST} ^www.domain-name.com$ RewriteCond %{REQUEST_URI} !папка/ RewriteRule (.*) https://www.domain1.com/folder/$1 [L]
Перезапись на абсолютный URL (т.е. со схемой + имя хоста) неявно вызовет внешний редирект и, следовательно, обнажит "скрытый" поддиректорий. Вам нужно оставить редирект (на www.domain1.com
) и переписать в /папку
как отдельные правила - это две разные задачи.
Моя первая мысль - трактовать это как одну систему. Сначала все перенаправления, затем перезаписываются. Я буду рассматривать перенаправление на 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
.
Просто для пояснения, это не "меняет папку root документа " - это возможно только изменением конфигурационного файла сервера. Это просто перезапись URL, которая скрывает подкаталог. Приложение по-прежнему видит корень документа, как определено конфигуратором сервера, т.е. /public_html/
.
UPDATE:
Если у вас еще нет общего 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 to www, который в настоящее время находится в конце блока перенаправления. Например:
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+) [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L]