我见过之前关于 ServerFault 的这个问题, 而且我要相似的东西,但我不确定如何实现它。
我想要的是删除所有斜线除了域名后面的永久链接外,其他均来自永久链接。例如:
http://www.muycomputerpro.com/Actualidad/Especiales/La-Ciudad-Eficiente-Netapp
将被重定向至
http://www.muycomputerpro.com/ActualidadEspecialesLa-Ciudad-Eficiente-Netapp
我需要它来纠正我的 WordPress 博客上剩余的一些 404 错误在 Apache 下web 服务器。那么,正确的重写规则是什么?
答案1
由于 RewriteRule 以路径开头(因此我们不需要担心域),您可以说的是,您要删除除第一个斜杠之外的所有斜杠,或者,在斜杠前面没有字符串开头时删除斜杠。
在正则表达式中这意味着使用负向后视,如下所示:
(?<!^)/
其中(?<!
...)
是负向后视语法,^
表示字符串的开始。
因此在配置中它看起来像:
RewriteRule (?<!^)/ $1 [L,R=301]
这里有一点需要猜测,即$1
表示空字符串 - 我以前没有用 mod_rewrite 这样做过,而且我找不到任何解释是否有“正确”的方法用空字符串替换的内容,但在其他正则表达式引擎中,使用未使用的反向引用将导致空字符串,所以应该没问题。(如果不行,我会看看是否""
可行。)
哦,还有[
...]
部分是一个逗号分隔的重写选项列表。L
是 Last - 表示不处理进一步的规则(通常这是期望的行为),R=301
是 301(永久)重定向(指示蜘蛛用新的 URL 更新其记录)。 有关在此处重写选项。