htaccess - 在几个非R = 301准备规则之后重定向

时间:2017-10-05 10:21:30

标签: apache .htaccess redirect mod-rewrite

如何减少我网站上301重定向的数量。

有几条说明:

RewriteRule 11 12 [R=301,L,QSA]
RewriteRule 21 22 [R=301,L,QSA]
RewriteRule 31 32 [R=301,L,QSA]
RewriteRule 41 42 [R=301,L,QSA]

我想这样做:

RewriteRule 11 12 [QSA,E=RCODE:301]
RewriteRule 21 22 [QSA,E=RCODE:301]
RewriteRule 31 32 [QSA,E=RCODE:301]
RewriteRule 41 42 [QSA,E=RCODE:301]

RewriteCond %{ENV:RCODE} =301
RewriteRule . - [R=301,L,QSA]

最后RewriteRule应该是什么?从.重定向到-并未更改原始网址!

2 个答案:

答案 0 :(得分:0)

如果网址格式与发布时相符(11 => 12; 21 => 22),则可以执行以下操作:

RewriteRule ^/?(\d)1$ $12 [R=301,L,QSA]

所以第一个数字保持不变,但如果第二个数字保持1,我们将重定向到目的地,第二个数字是2

答案 1 :(得分:0)

  

最后RewriteRule应该是什么?

由于URL路径(RewriteRule 模式匹配)在处理前面的RewriteRule指令时更新,因此您可以捕获当前的URL路径和在替换中使用它。例如:

RewriteRule (.*) /$1 [R=301,L,QSA]

替换中使用单个-(连字符)用于"传递",当URL未更改时(如您所见)。

一个工作示例:

RewriteBase /

RewriteRule 11 12 [E=RCODE:302]
RewriteRule 21 22 [E=RCODE:302]
RewriteRule 31 32 [E=RCODE:302]
RewriteRule 41 42 [E=RCODE:302]

RewriteCond %{ENV:RCODE} !^$
RewriteRule (.*) /$1 [R=${ENV:RCODE},L]

这使用前面指令设置的任何代码(301,302,303等),并且只在设置了代码时才处理最后的重写。

(使用302 - 临时 - 重定向到测试有助于避免缓存问题。)

然而,这是一个非常假设的"例。在这种情况下,只需删除第一个示例中的L标记,即可获得相同的结果,代码更少。但是,你的第一个例子 - 带有L标志 - 是这个"非常假设的#34;中最好的(最有效的)方法。例! (因为在这个例子中,最多只有1个重定向,L标志可以防止以下指令被不必要地处理。)

因此,由于问题中的信息量有限,以这种方式进行操作并没有多大意义。如果您首先用自然语言描述问题,那么可能有更好的方法来解决这个问题。就目前而言,它看起来像XY problem