是否可以拥有通用/多域 httpd.conf行,将任何非www请求重定向到其www等价物?
通用,我指的是不依赖于硬编码域名的东西,即
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [L,R=301]
每次我从服务器添加/删除其他网站时,我真的不想编辑httpd.conf。网站是动态添加/删除的!
答案 0 :(得分:3)
mod_rewrite documentation包含您需要的所有信息,但需要阅读很多内容。您想要的部分分为两部分:首先,您需要匹配任何不以www.
开头的域名;然后,您需要在www.
前加上当前网址。
对于第一部分,这是(适用于RewriteCond
和RewriteRule
):
您可以在模式字符串前加上'!'字符(感叹号)指定不匹配的模式。
所以“主机名不会开始www。”可以这样测试:
RewriteCond %{HTTP_HOST} !^www\. [NC]
第二部分是:
除了纯文本,Substition字符串还可以包含服务器变量,如规则条件测试字符串(%{VARNAME})
因此实际的重定向可以像这样通用:
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301]
顺便说一下,也可以做相反的事情(将所有内容重定向到而不是有www.
),因为RewriteRule
替换也可以使用这个:
反向引用(%N)到最后匹配的RewriteCond模式
因此,您可以在 www.
之后捕获主机名中的所有内容,并将其用作规则的目标:
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]