如何配置Apache以拒绝除localhost的XMLHttpRequest之外的所有请求?

时间:2016-04-27 20:32:56

标签: apache xmlhttprequest mod-wsgi

我有一个Flask网站,在Ubuntu 14.04上使用mod_wsgi(3.4)和Apache(2.4.7)。虚拟主机配置有两个目录块 - 一个用于Flask应用程序,另一个用于静态文件目录,Flask应用程序有时通过XMLHttpRequest获取。

我希望只有来自Flask应用程序的请求才能访问静态文件目录,但是在设置Apache时无法执行此操作。我已尝试Require localRequire ip 127.0.0.1Require sd.d.com,但每个都会导致XMLHttpRequest的403。

[XMLHttpRequest可以正常使用Require all granted(Flask应用和静态目录位于同一个子域,服务器和端口),所以我认为这不是与CORS相关的问题。 ]

这是我的Apache conf文件:

<VirtualHost *:80>
  ServerName sd.d.com
  WSGIDaemonProcess mag user=www-data group=www-data threads=5 python-path=/var/www/sd.d.com:/var/www/sd.d.com/venv/lib/python3.4/site-packages
  WSGIProcessGroup mag
  WSGIScriptAlias / /var/www/sd.d.com/mag.wsgi
  <Directory /var/www/sd.d.com>
    Require all granted
  </Directory>
  Alias /models /var/www/sd.d.com/models
  <Directory /var/www/sd.d.com/models>
    Require local # Tried this
    # Require ip 127.0.0.1 # Also tried this
    # Require host sd.d.com # Also tried this
  </Directory>
  ErrorLog /var/www/sd.d.com/error.log
  CustomLog /var/www/sd.d.com/access.log combined
  LogLevel debug
</VirtualHost>

以下是403:

之后来自access.log的示例
02dec1b9.bb.sky.com - - [27/Apr/2016:19:02:49 +0000] "GET /models/cbc96411-aa47-4417-bea4-95943b98b1d3/cbc96411-aa47-4417-bea4-95943b98b1d3.stl HTTP/1.1" 403 581 "http://sd.d.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.86 Safari/537.36"

不知道这是否相关,但我期待XMLHttpRequest请求来自localhost而不是02dec1b9.bb.sky.com。我的访问日志文件设置如下:

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

来自error.log的同一个失败请求:

[Wed Apr 27 19:02:49.381706 2016] [authz_core:error] [pid 18700:tid 140508152153856] [client 2.222.193.185:59865] AH01630: client denied by server configuration: /var/www/sd.d.com/models/cbc96411-aa47-4417-bea4-95943b98b1d3/cbc96411-aa47-4417-bea4-95943b98b1d3.stl, referer: http://sd.d.com/

如何配置Apache以拒绝除所需XMLHttpRequest以外的所有请求?

更新

如果我将models /目录设置为Require all granted,则成功的XMLHttpRequest将记录为2.222.193.185而不是02dec1b9.bb.sky.com:

2.222.193.185 - - [28/Apr/2016:09:41:02 +0000] "GET /models/ca19d6ca-715e-4a0f-89f0-f5e3059f57ff/ca19d6ca-715e-4a0f-89f0-f5e3059f57ff.stl HTTP/1.1" 200 4426280 "http://sd.d.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.86 Safari/537.36"

1 个答案:

答案 0 :(得分:0)

如果推荐人与我的网站域名匹配,我目前正在设置a variable in Apache

<Directory /var/www/sd.d.com/models>
  SetEnvIf Referer sd\.d\.com local_request
  Require env local_request
</Directory>

我知道引用者可能会被欺骗,但这对我的目的来说可能足够安全。

有兴趣听听任何其他解决方案!