RewriteRule ^stores/(.*)/$ /stores/$1-coupon-codes [R=301,NC,L]
您可能可以使用否定的前瞻断言来排除已经包含
-coupon-codes
避免再次被重定向,从而阻止重定向循环(我假设这里发生的就是这样)。
例如:
RewriteRule ^stores/(?!.*-coupon-codes)(.+)/$ /stores/$1-coupon-codes [R=301,NC,L]
消极前瞻
(?!
...
)
当URL已包含时,导致模式匹配失败
-coupon-codes
.
您需要清除浏览器缓存,我建议首先使用302(临时)重定向进行测试,以避免潜在的缓存问题。
然而,这里有一些不一致之处。。。你举了个例子/stores/walmart
(无尾部斜杠)。但是你所说的规则(你说的是重定向)只会重定向包含尾部斜杠的URL。如果原始URL包含尾部斜杠,则此处不会有重定向循环(因为您重定向到的URL不包含尾部斜杠),除非<还有什么东西在后面加斜杠?
UPDATE: 它只适用于结尾带有斜杠的URL。有什么解决办法吗?就像在网站的所有URL上添加斜杠,如果他们还没有斜杠的话。
是的,您可以在上面的正则表达式中使尾部斜杠成为可选的。但是,您还需要创建前面的捕获组(即。(.+)
) 不贪婪,即。(.+?)
这样它就不会使用可选的尾部斜杠。例如:
RewriteRule ^stores/(?!.*-coupon-codes)(.+?)/?$ /stores/$1-coupon-codes [R=301,NC,L]
“我不会”;附加斜杠;指向此重定向之前的所有URL,因为这将导致另一个重定向。如果需要的话,您可以自然地在生成的替换字符串中添加斜杠。ie。
/stores/$1-coupon-codes/
.
我在分页时发现的另一个问题是,URL被破坏了:stores/walmart/page/2-coupon-codes
, 像这样附加它
您可以添加一个条件来排除以最后一个路径段中的数字结尾的URL。例如:。/stores/walmart/page/2
或/<anything>/<number>
. 例如:
RewriteCond %{REQUEST_URI} !/\\d+$
RewriteRule ^stores/(?!.*-coupon-codes)(.+?)/?$ /stores/$1-coupon-codes [R=301,NC,L]
The
!
CondPattern上的前缀(第二个参数
RewriteCond
指令)否定比较,因此当正则表达式不匹配时,它是成功的。在这种情况下,如果URL路径不以仅由数字组成的路径段结束,则此操作将成功。
但无法为负前瞻添加有效的正则表达式。
您不需要使用消极的前瞻,您可以使用附加的条件(RewriteCond
指令)代替。例如:
RewriteCond %{REQUEST_URI} !/\\d+$
RewriteCond %{REQUEST_URI} !-coupon-codes/?$ [NC]
RewriteRule ^stores/(.+?)/?$ /stores/$1-coupon-codes [R=301,NC,L]
我并没有在上面提到这一点,因为您似乎已经将指令放在了正确的位置,但这些指令需要放在
.htaccess
文件,位于WordPress前端控制器之前。