我有一个重写地图,其中包含要重定向的域列表。目前我必须在重写地图中列出www.foo.com和foo.com。我想知道是否有办法在同一行中对www和非www进行重写检查。
# Rewrite Map
foo.com file.php
www.foo.com file.php
# modrewrite
RewriteCond ${domainmappings:%{HTTP_HOST}} ^(.+)$ [NC]
RewriteCond %1 !^NOTFOUND$
RewriteRule ^.*$ www.domain.com/%1 [L,R=301]
我尝试过像(www。)%{HTTP_HOST}或^(www。)%{HTTP_HOST}这样的事情,但没有运气。
答案 0 :(得分:16)
这应该这样做:
RewriteCond %{HTTP_HOST} ^(www\.)?(.+)
RewriteCond ${domainmappings:%2} ^(.+)$ [NC]
RewriteRule ^ /%1 [L,R=301]
第一个RewriteCond
将删除可选的www.
前缀。然后将余数用作第二个RewriteCond
中重写映射的参数。
如果未找到匹配项,则纯文本文件重写映射将返回空字符串:
如果找到密钥,则map-function构造将替换为 SubstValue 。如果未找到密钥,则如果未指定 DefaultValue ,则将其替换为 DefaultValue 或空字符串。
因此,如果满足第二个条件(请注意^(.+)$
),则会找到匹配项,%1
将包含 SubstValue (在这种情况下为file.php
})。
答案 1 :(得分:5)
来自这里的帖子
http://www.eukhost.com/forums/f15/simple-rewriterule-set-redirect-domain-6570/
RewriteEngine on
RewriteCond %{HTTP_HOST} ^xyz.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.xyz.com$
RewriteRule ^(.*)$ http://www.xyz.com/test//$1 [R=301,L]
答案 2 :(得分:0)
您可以尝试制作www。部分可选以下内容:
# Rewrite Map
www.foo.com file.php
# modrewrite
# redirect to www domain always
RewriteCond %{HTTP_HOST} ^([^.]+\.[^.]+)$
RewriteRule (.*) http://www\.%1/$1 [L,R=301,QSA)
# redirect following the map
RewriteCond ${domainmappings:%{HTTP_HOST}} ^(.+)$ [NC]
RewriteCond %1 !^NOTFOUND$
RewriteRule ^.*$ www.domain.com/%1 [L,R=301]
首先将anything.anything
重定向到www.anything.anything
,然后在下一个请求中应用您的规则。虽然没有保证,但对重写地图不太了解。
答案 3 :(得分:0)
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^domain.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.domain.com$
RewriteRule ^ https://www.domain.com%{REQUEST_URI} [R=301,L]