Назад | Перейти на главную страницу

как перенаправить на 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-адресе.

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

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]