Apache:如何始终为路径部分以“//”开头的 URL 返回 404

Apache:如何始终为路径部分以“//”开头的 URL 返回 404

如何配置 apache 以便始终对路径部分以两个斜杠(即“//”)开头的 URL 返回 404?

我们只从不理解方案相对 URL 的机器人那里收到此类请求(因此,当它们看到像“//somecdn.com/thingy.js”这样的 URL 时,它们会请求“http://oursite.com//somecdn.com/thingy.js“)。他们得到了 404 响应,这很好。问题是 404 来自我们的 Django 代码,它尽职尽责地向我们发送了一封电子邮件,说有人得到了 404,而他们的引荐来源是我们的网站。

这是我们相关的 apache 配置:

DocumentRoot /nowhere

Alias /static/ /our/static/files
Alias /uploads/ /our/uploaded/files

<VirtualHost :*80>

  ServerName oursite.com

  WSGIScriptAlias / /our/wsgi/script

</VirtualHost>

我尝试插入RedirectMatch 404 "^//"After DocumentRoot,但请求仍然停留在 WSGI 脚本中。将正则表达式更改为"^/.*$"每个请求都为 404(正如我所料)。"^\/\/"似乎没有匹配任何内容。

我假设我违反了某种多重/挤压,但我不知道如何解决它。

此 Apache 2.2.22 带有 Ubuntu 12.04 上的 mod_wsgi 3.3。

答案1

您可以使用 RewriteCond%{请求}

请求

浏览器向服务器发送的完整 HTTP 请求行(例如“GET /index.html HTTP/1.1”)。这不包括浏览器发送的任何其他标头。与下面的大多数其他变量不同,此值尚未被转义(解码)。

与 %{REQUEST_URI} 不同,它尚未被解码,或者有重复的斜线折叠。

# method, space(s), then URL
RewriteCond %{THE_REQUEST} ^\S+\s+//
RewriteRule .* - [R=404]

相关内容