как перенаправить на www, а также изменить корневую папку документа в htaccess

Как создать следующие правила в .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-адресе.

1
задан 14 August 2019 в 17:19
1 ответ

Несколько комментариев о ваших попытках...

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]
1
ответ дан 3 December 2019 в 23:01

Теги

Похожие вопросы