如何在重写中匹配www和非www?

时间:2010-12-30 22:27:42

标签: regex apache mod-rewrite rewritemap

我有一个重写地图,其中包含要重定向的域列表。目前我必须在重写地图中列出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}这样的事情,但没有运气。

4 个答案:

答案 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]