.htaccess 在3或4个字符后重写规则
我的URL如下所示:.htaccess 在3或4个字符后重写规则,.htaccess,redirect,.htaccess,Redirect,我的URL如下所示: www.example.com/1234-title-of-an-event/whatever/ 我需要在“1234-”(但也可以是3位数字,如“123-”)之后和斜杠“/无论什么”之前获取所有内容,以便重定向为: www.example.com/title-of-an-event/ 我尝试使用以下规则(作为最后一条规则),但它似乎不起作用,我只得到一个500内部服务器错误 RewriteRule ^\/([0-9]{3,4})-(.*)\/(.*) https://w
www.example.com/1234-title-of-an-event/whatever/
我需要在“1234-”
(但也可以是3位数字,如“123-”)之后和斜杠“/无论什么”之前获取所有内容,以便重定向为:
www.example.com/title-of-an-event/
我尝试使用以下规则(作为最后一条规则),但它似乎不起作用,我只得到一个500内部服务器错误
RewriteRule ^\/([0-9]{3,4})-(.*)\/(.*) https://www.example.com/$2 [R=301, L]
500错误很可能是由flags参数中的空格引起的。它应该是[R=301,L]
(无空格)。但是,由于RewriteRule
模式上的斜杠前缀,此指令在.htaccess
中不会执行任何操作。在目录上下文(即.htaccess
)中,由重写规则
模式匹配的URL路径不包括目录前缀,该前缀以斜杠结尾,因此匹配的URL路径从不以斜杠开头。(您需要在服务器/vhost上下文中匹配斜杠前缀。)
如果您有其他mod_rewrite指令,这也可能不是“最后一条规则”——可能存在冲突(没有看到整个文件)
无需在重写规则
模式中转义斜杠。斜杠在这里没有特殊意义,因为空格在Apache配置文件中有效地用作正则表达式分隔符
我还将修改您的正则表达式以匹配除斜杠(即[^/]+
)以外的所有内容,而不是所有内容,因为您的正则表达式(捕获子模式)将匹配示例URL中事件的标题/任何内容,而不是预期的事件的标题。因为默认情况下regex是贪婪的
因此,请在.htaccess
文件顶部附近尝试以下操作:
RewriteRule ^\d{3,4}-([^/]+) /$1 [R=302,L]
这将匹配事件的/1234标题
,并放弃所有其他内容,在$1
反向引用中返回事件的标题
。(成功匹配是否需要尾部的/
)
\d
只是[0-9]
的简写
如果没有使用反向引用,则不需要在正则表达式中捕获子模式
除非您有多个域或在重定向响应中规范化方案/主机名,否则无需在替换中包含绝对URL
请注意,这是一个302(临时)重定向-仅更改为301(永久)重定向-如果这是您的意图-一旦您确认此工作正常,以避免缓存问题。您需要确保在测试之前清除浏览器缓存
RewriteRule ^\d{3,4}-([^/]+) /$1 [R=302,L]