我有一个Flask网站,在Ubuntu 14.04上使用mod_wsgi(3.4)和Apache(2.4.7)。虚拟主机配置有两个目录块 - 一个用于Flask应用程序,另一个用于静态文件目录,Flask应用程序有时通过XMLHttpRequest
获取。
我希望只有来自Flask应用程序的请求才能访问静态文件目录,但是在设置Apache时无法执行此操作。我已尝试Require local
,Require ip 127.0.0.1
和Require 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"
答案 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>
我知道引用者可能会被欺骗,但这对我的目的来说可能足够安全。
有兴趣听听任何其他解决方案!