我的URL是这样的:
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]
发布于 2019-06-25 04:53:53
RewriteRule ^\/(0-9{3,4})-(.*)\/(.*) https://www.example.com/$2 R=301,L
500错误很可能是由标志参数中的空格引起的。它应该是[R=301,L]
(没有空格)。然而,由于RewriteRule
模式中的斜杠前缀,该指令在.htaccess
中不会做任何事情。在目录上下文中(即,RewriteRule
模式匹配的URL-path不包括目录前缀,目录前缀以斜杠结尾,因此匹配的URL-path永远不会以斜杠开始。(您需要在服务器/vhost上下文中匹配斜杠前缀。)
如果你有其他的mod_rewrite指令,这也不应该是“最后的规则”--可能会有冲突(没有看到整个文件)。
在RewriteRule
模式中不需要转义斜杠。斜杠在这里没有特殊意义,因为空格在Apache配置文件中有效地用作regex分隔符。
我还会修改您的正则表达式以匹配除斜杠以外的所有内容(即。[^/]+
),而不是所有内容,因为您的正则表达式(捕获子模式)将匹配示例URL中的title-of-an-event/whatever
,而不是预期的title-of-an-event
。因为regex在默认情况下是贪婪的。
因此,请尝试在.htaccess
文件顶部附近执行以下操作:
RewriteRule ^\d{3,4}-([^/]+) /$1 [R=302,L]
这与/1234-title-of-an-event
匹配,并丢弃其他所有内容,在$1
反向引用中返回title-of-an-event
。(是否需要尾随/<whatever>/
才能成功匹配?)
\d
是[0-9]
的简写。
如果没有使用反向引用,则不需要在正则表达式中捕获子模式。
没有必要在替换中包含绝对URL,除非您有多个域,或者正在对重定向响应中的方案/主机名进行规范化。
请注意,这是一个302 (临时)重定向-仅更改为301 (永久)重定向-如果这是您的意图-一旦您确认它工作正常,以避免缓存问题。您需要确保在测试之前清除您的浏览器缓存。
https://stackoverflow.com/questions/56735167
复制相似问题