9

我有一个重写映射,其中包含要重定向的域列表。目前我必须在重写地图中列出 www.foo.com 和 foo.com。我想知道是否有一种方法可以在同一行中同时检查 www 和非 www 的 rewritecond。

# 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

4 回答 4

17

这应该这样做:

RewriteCond %{HTTP_HOST} ^(www\.)?(.+)
RewriteCond ${domainmappings:%2} ^(.+)$ [NC]
RewriteRule ^ /%1 [L,R=301]

第一个RewriteCond将删除可选www.前缀。然后将余数用作第二个中重写映射的参数RewriteCond

如果未找到匹配项,纯文本文件重写映射将返回一个空字符串:

如果找到键,则映射函数构造由SubstValue 替换。如果未找到该键,则将其替换为DefaultValue或如果未指定DefaultValue,则由空字符串替换。

因此,如果满足第二个条件(注意^(.+)$),则已找到匹配项%1并将包含SubstValue(在本例中file.php)。

于 2010-12-30T22:55:48.237 回答
8

从这里的帖子

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]
于 2010-12-30T22:32:10.740 回答
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.anythingwww.anything.anything,然后将您的规则应用于下一个请求。对重写地图不太了解,但不能保证。

于 2010-12-30T22:53:42.533 回答
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]
于 2016-04-21T16:55:40.270 回答