.htaccess强制对所有非子域名的内容添加"www."前缀,并删除尾部斜杠。

4

这是我目前的进展:

#Force www.
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

#Remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} (.*)$
RewriteRule ^(.+)/$ http://www.domain.com/$1 [R=301,L]

然而,这会导致所有子域名都出现以下重定向混乱:
sub.domain.com -> www.sub.domain.com

而且,它取决于去除尾部斜线位上写的域名。

所以……有两个问题。

如何重写“去除尾部斜线”位上的规则,以排除在其上写入域名?

如何创建一个rewritecond来排除子域,而无需明确写下它们,在“强制www.”位上?

所需结果示例 -

sub.domain.com/something/ -> sub.domain.com/something
domain.com/something/ -> www.domain.com/something
www.domain.com/ -> www.domain.com
sub.domain.com -> sub.domain.com

谢谢!


你想要发生什么还不清楚。你能提供一组输入以及你想要将它们转换成什么吗? - RoUS
我添加了一些例子! - IOrlandoni
1个回答

7
将“www”更改为实际域名进行检查:
#Force www.
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

或者,如果您托管了许多域名,您可以在顶级域名之前检查名称:

RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^([^.]+)\.([a-z]{2,4})$ [NC]
RewriteRule ^ http://www.%1.%2%{REQUEST_URI} [L,R=301]

关于斜杠后缀,你必须小心,确保请求不是针对目录的。因为如果这样,并且你开启了DirectorySlash(默认是开启的),那么就会导致重定向循环。
为了排除子域名,我们假设第一个规则将浏览器重定向以确保它以“www”开头,由于子域名没有被重定向以以“www”开头,所以我们只需检查它即可:
#Remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.+)/$ /$1 [R=301,L]

我使用了 force www 的第二个选项,这个选项和 remove trailing slash 都完美地工作了。您能否解释一下 force www 中的正则表达式和逻辑? - IOrlandoni
3
@OhCaN 我们希望在变量 %{HTTP_HOST} 中只有一个 .,所以 ^ 表示字符串的开头,然后 ([^.]+) 匹配一个或多个不是 . 的字符,接着是一个 .,然后 ([a-z]{2,4}) 匹配 2 到 4 个字母(a-z),最后 $ 表示字符串的结尾。 - Jon Lin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接