3个或4个字符后的重写

时间:2019-06-24 11:00:49

标签: .htaccess redirect

我的网址是这样的:

www.example.com/1234-title-of-an-event/whatever/

我需要在"1234-"之后(但也可以是3位数字,例如“ 123-”)和斜杠“ / whatever”之前的所有内容,以便重定向为:

www.example.com/title-of-an-event/

我正在尝试遵循以下规则(作为最后一条规则),但是它似乎不起作用,我只能得到500 Internal Server Error

RewriteRule ^\/([0-9]{3,4})-(.*)\/(.*) https://www.example.com/$2 [R=301, L]

1 个答案:

答案 0 :(得分:1)

RewriteRule ^\/([0-9]{3,4})-(.*)\/(.*) https://www.example.com/$2 [R=301, L]

500错误很可能是由flags参数中的 space 引起的。它应该是[R=301,L](无空格)。但是,由于.htaccess pattern 上的斜杠前缀,此指令在RewriteRule中不起作用。在目录上下文(即.htaccess)中,与RewriteRule pattern 匹配的URL路径排除了目录前缀,该前缀通常以斜杠结尾,因此匹配的URL路径永远不会以斜杠开头。 (您需要在服务器/虚拟主机上下文中匹配斜杠前缀。)

如果您还有其他mod_rewrite指令,这也可能不是“最后一条规则”-可能会发生冲突(看不到您的整个文件)。

RewriteRule 模式中无需转义斜杠。斜线在这里没有特殊含义,因为空格在Apache配置文件中有效地用作正则表达式定界符。

由于您的正则表达式(捕获子模式),我还将修改您的正则表达式以匹配除斜杠(即[^/]+)以外的所有内容(即title-of-an-event/whatever),而不是所有内容。将与您的示例网址中的title-of-an-event匹配,而不是预期的.htaccess匹配。由于正则表达式默认为贪婪

因此,请尝试在RewriteRule ^\d{3,4}-([^/]+) /$1 [R=302,L] 文件的 top 附近尝试以下操作:

/1234-title-of-an-event

这与title-of-an-event匹配,并丢弃其他所有内容,并在$1后向引用中返回/<whatever>/。 (成功进行匹配是否需要结尾\d?)

[0-9]只是{{1}}的简写。

如果未使用反向引用,则无需在正则表达式中具有捕获子模式。

除非您有多个域或在重定向响应中对方案/主机名进行了规范化,否则无需在替代中包含绝对URL。

请注意,这是302(临时)重定向-如果您打算这样做,请仅更改为301(永久)重定向,一旦您确认这样做可以正常进行,以避免缓存问题。在测试之前,您需要确保清除浏览器缓存。