.htaccess 删除导致内部服务器错误的 URL 路径段

Posted

技术标签:

【中文标题】.htaccess 删除导致内部服务器错误的 URL 路径段【英文标题】:.htaccess remove URL path segments that are causing an Internal Server Error 【发布时间】:2021-11-10 16:39:31 【问题描述】:

如果 URL 类似于:example.com/news/post-1,则下面的 .htaccess Rewrite 下面似乎工作正常:

RewriteRule ^/?news/([^/]+)/?$ article.php?slug=$1 [L,QSA]

但是,如果 URL 包含更多参数,例如:example.com/news/post-1/comment-page-1(来自网站其他版本的 URL)我将收到 500 Internal Server Error。

如何让它重定向到相关帖子而不是 500 Internal Server Error?

【问题讨论】:

日志显示什么?是因为slug 值的原因吗?如果您不在乎 news/ 之后的内容,可以将 ([^/]+)/? 交换为 (.*) 您的规则与开头的第二种 URL 格式不匹配。 没错,CBroe 规则只适用于一个参数,所以如果旧 URL 有多个参数,我如何让它重定向到主帖子? user3783243 日志仅显示“由于可能的配置错误,请求超出了 10 个内部重定向的限制”,(.*) 肯定有帮助,至少不再显示 500。 "如果您不在乎 news/ 之后的内容,可以将 ([^/]+)/? 交换为 (.*)" - 尽管这最终会将 错误 值传递给slug URL 参数(然后需要在 PHP 脚本中删除或 404)。您可以将正则表达式的最后一部分更改为 ([^/]+)(?:$|/) - 以简单地丢弃 URL 的其余部分,但这可能会导致重复内容问题。您最好redirecting 丢弃URL 路径中不需要的部分。 @user3783243 【参考方案1】:

如果 URL 有更多参数,例如:example.com/news/post-1/comment-page-1(来自网站其他版本的 URL)我将收到 500 内部服务器错误。

该 500 错误是由您的 .htaccess 文件中的 其他内容 引起的,因为您发布的指令将不适用(如 cmets 中的 @CBroe 所述)。

因此,500 错误可以通过修复导致此问题的任何指令来解决。

顺便说一下,这些是“路径段”,而不是“参数”。您可能会将它们视为脚本的参数,但这不是它们在请求的 URL 中的内容。

如何让它重定向到相关帖子而不是 500 Internal Server Error?

如果您想通过将/news/<slug>/<anything> 重定向到/news/<slug>/ 来解决此问题,那么您可以在现有的重写之前在.htaccess 文件的顶部 附近执行以下操作:

# Remove additional path segments from the URL-path
RewriteRule ^(news/[^/]+/). /$1 [R=302,L]

正则表达式上的点匹配最后一个斜杠后的单个字符,因此必须包含一个额外的路径段(至少)。

$1 反向引用仅包含您感兴趣的 URL 路径部分(即/news/<slug>/)并重定向到此。

请注意,这目前是 302(临时)重定向。在确认它按预期工作后,在更改为 301(永久)重定向之前,请始终使用 302 进行测试以避免潜在的缓存问题。

【讨论】:

谢谢,这正是我想要做的。

以上是关于.htaccess 删除导致内部服务器错误的 URL 路径段的主要内容,如果未能解决你的问题,请参考以下文章

内部服务器错误 - htaccess

使用 .htaccess 删除文件扩展名会导致错误

.htaccess 500 wamp 中的内部服务器错误

.htaccess 错误内部服务器 500

我的 .htaccess 出现内部服务器错误

使用 .htaccess 进行 PHP 设置时出现 500 内部服务器错误