.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 路径段的主要内容,如果未能解决你的问题,请参考以下文章