我的网址是这样的:
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]
答案 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(永久)重定向,一旦您确认这样做可以正常进行,以避免缓存问题。在测试之前,您需要确保清除浏览器缓存。