Apache 使用.htaccess为移动的页面创建智能域常规301重定向

Apache 使用.htaccess为移动的页面创建智能域常规301重定向,apache,.htaccess,mod-rewrite,redirect,url-rewriting,Apache,.htaccess,Mod Rewrite,Redirect,Url Rewriting,当我使用服务器的web gui定义重定向时,我发现服务器的c面板生成了以下形式的代码。这个很好用。然而,我担心我可以写得更有效,更全面,希望少重复 RewriteCond %{HTTP_HOST} ^domain\.com$ [OR] RewriteCond %{HTTP_HOST} ^www\.domain\.com$ RewriteRule ^some/unwanted/uri$ "http\:\/\/www\.domain\.com\/some/improved/uri" [R=301,L

当我使用服务器的web gui定义重定向时,我发现服务器的c面板生成了以下形式的代码。这个很好用。然而,我担心我可以写得更有效,更全面,希望少重复

RewriteCond %{HTTP_HOST} ^domain\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.domain\.com$
RewriteRule ^some/unwanted/uri$ "http\:\/\/www\.domain\.com\/some/improved/uri" [R=301,L]

RewriteCond %{HTTP_HOST} ^domain\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.domain\.com$
RewriteRule ^someother/unwanted/uri$ "http\:\/\/www\.domain\.com\/someother/improved/uri" [R=301,L]

repeat x20
我从他的回答中了解到,通常有必要重复以下内容

RewriteCond %{HTTP_HOST} ^domain\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.domain\.com$
然而,他建议将其缩短为:

RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$
这无疑是一个进步,但如何才能使它变得更为普遍。是否可以这样写,以便更广泛地应用于test.domain.com? e、 g:

我还从的回答中了解到,我还可以在代码中替换以下内容

"http\:\/\/www\.domain\.com\/some/improved/uri" [R=301,L]
与:

很高兴它既短又广

是否有必要不断重复以下内容

是的,重写条件仅适用于紧随其后的规则,因此任何后续规则都不会应用这些条件

重复这些条件并不是很低效,因为除非规则的模式匹配,否则这些条件甚至不会被检查。这意味着根据这条规则:

RewriteCond %{HTTP_HOST} ^peterliddle\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.peterliddle\.com$
RewriteRule ^work/cornwall/cornwall_early$ /redirect-target [L,R=301]
如果URL是
/blahblah
,则重写引擎首先尝试根据规则的模式匹配该URL,并且由于它与
^work/cornwall/cornwall\u early$
不匹配,因此跳过整个规则,甚至不需要考虑条件

如果这是一个难以阅读的问题,您可以在最上面有一条规则,如果不满足这些条件,它将绕过htaccess文件中的所有规则。例如:

RewriteCond %{HTTP_HOST} !^(www\.)?peterliddle\.com$ [NC]
RewriteRule ^ - [L]

RewriteRule ^work/cornwall/cornwall_early$ http://www.peterliddle.com/work/cornwall/cornwall_58-65 [R=301,L]
RewriteRule ^work/cornwall/cornwall$ http://www.peterliddle.com/work/cornwall/cornwall_66-69 [R=301,L]
RewriteRule ^work/whale_moor_a/a_first$ http://www.peterliddle.com/work/whale_moor/lakeland_hills [R=301,L]
因此,如果HTTP主机的条件失败,则完全忽略这些规则。这样做的问题是,您必须添加任何不希望条件应用于这些规则之上的新规则


您还可以删除
http://www.peterliddle.com
部分来自规则的目标,因为您已经在HTTP_主机中对同一个域进行了测试。

以下是关于堆栈溢出、测试和一些阅读的建议,我在下面的表单中列出了重写规则:

RewriteCond %{HTTP_HOST} (^|\.)domain\.com$
RewriteRule ^some/unwanted/uri$ "/some/improved/uri" [R=301,L]
注意:以下代码段不起作用。它会使站点崩溃,不推荐使用

RewriteCond %{HTTP_HOST} ^(*\.)?domain\.com$
以下接缝将跨所有子域工作。因此,我可以在
test.domain.com
中进行测试,然后在
www.domain.com
中使用相同的
.htaccess
文件,并对它的工作更有信心,而无需对代码进行进一步更改

RewriteCond %{HTTP_HOST} (^|\.)domain\.com$

对于该模式,您可以使用
RewriteCond%{HTTP_HOST}^(www\)?peterliddle\.com$
RewriteRule^(.*)/ve/(.*)$$1/自愿员工/$2[L,R=301]RewriteRule^(.*)/hsa/$1/健康储蓄账户/$2[L,R=301]
非常感谢您解释了这些条件是如何使用的,以及Apache是如何解释它们的。所以
http://www.peterliddle.com/work/whale_moor/lakeland_hills [R=301,L]
可能变成
/work/whale\u moor/lakeland\u hills[R=301,L]
RewriteCond %{HTTP_HOST} ^(*\.)?domain\.com$
RewriteCond %{HTTP_HOST} (^|\.)domain\.com$