我们有一个运行 PHP-FPM 和 NGINX 的网站。该应用程序向网站成员发送邀请,这些邀请以 40 个字符的随机字符串为键(仅限字母数字 - 见下文示例)。今天我们第一次遇到了这种方法的问题。以下网址:
http://oursite.com/notices/response/approve/1960/OzH0pedV3rJhefFlMezDuoOQSomlUVdhJUliAhjS
返回 404 错误。此 URL 格式已运行 6 个月,没有出现问题,其他遵循此格式的 URL 继续正确解析。我们有一个非常基本的配置,带有一个简单的重定向到前端控制器,其他一切都运行良好。
另外,如果我们将最后一个字符从“S”更改为小写“s”以外的任何字符,则不会出现 404 错误,并且网站会正确处理请求,所以我想知道是否存在某些安全模块可能会发现这个特定字符串有问题...不确定这是否有意义。
我们不确定要去哪里查找导致该问题的具体原因,因此如果能提供任何指导我们将不胜感激。
谢谢!
更新:在 URL 末尾添加斜线可以正确处理它...但仍然希望彻底解决这个问题。
已解决:该问题是由我的部分配置引起的...我意识到我应该发布此信息,但是当时我正在出城,没有机会。
任何以“css”或“js”结尾的 URL,并且前面不一定有一个点(例如,http://site.com/response/somerandomestringcss) 被解释为对文件的请求,并且该请求未通过前端控制器路由。问题在于我的正则表达式,用于禁用日志记录和设置 jpg、gif、icos 等的过期标头。
我替换了这个:
location ~* ^.+(jpg|jpeg|gif|css|png|js|ico)$ {
有了这个:
location ~* \.(jpg|jpeg|gif|css|png|js|ico)$ {
现在,以 css、js、png 等结尾的 URL 已正确通过前端控制器路由。希望这能帮助其他人。
答案1
来自OP:
这是配置文件的问题;我有条件地设置了过期标头并禁用了图像、js、css、ico 文件等的日志记录。我有:
location ~* ^.+(jpeg|jpg|gif|css|png|js|ico)${
并将其改为:
location ~* \.(jpeg|jpg|gif|css|png|js|ico)${
现在,当我请求以其中一个字符串结尾的 URL 时,它会将其解析为 URL,而不是文件,因此不再出现 404 错误。
答案2
也许你的 url 正则表达式不包含大写字符恰当的方式。你能在这里发布吗?