如何重定向到 www 同时更改 htaccess 中的文档根文件夹

如何重定向到 www 同时更改 htaccess 中的文档根文件夹

如何在 .htaccess 中创建以下规则?Mod 重写已启用。但我遇到了问题。

对于情况(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 中的子文件夹,这不是我想要的!

我从 siteground 上发现了以下内容: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

对您的尝试的一些评论...

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视为一般情况,因此我将最后包括它。

注意:首先使用 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在同一主机上(这实际上是你应该实现的一项要求)高速传输系统)。随后的重定向将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]

相关内容