从 nginx 反向代理后面的 cherrypy.request 获取传入的引用域

Get incoming referer domain from cherrypy.request behind nginx reverse proxy

我正在尝试根据允许的域白名单检查用户刚从哪个网站访问我的网站:

import cherrypy
import urlparse
referer = cherrypy.request.headers.get('Referer','/').lower()
domain = urlparse.urlparse(referer).netloc
if domain in ('mysite.org','whitelistedsite.com'):
    ... do stuff ...

但是我的 cherrypy 位于 NGINX 后面(作为反向代理),所以我什么也得不到。

 ('X-Forwarded-Host', 'this.org')
 ('Host', 'this.org')

我该如何解决这个问题?或者不编辑 NGINX 是不可能的,这是我做不到的。

有关 NGINX 反向代理背后的 cherrypy 的更多一般信息在此处 https://www.digitalocean.com/community/tutorials/how-to-deploy-cherrypy-web-applications-behind-nginx-reverse-proxy

简短的回答是 Nginx 不应该屏蔽 referer。 Nginx 会屏蔽主机 header,你需要使用代理工具才能根据原始代理发送的主机设置 cherrypy.request.remote.ip 和 cherrypy.request.base。但是Referer应该原样传递。

您的托管服务提供商有可能(尽管似乎不太可能)删除引用 header。

例如,我有一个服务将使用此处理程序回显请求 headers:

class System: @cherrypy.expose def headers(self): return cherrypy.request.headers

那台服务器位于 Nginx 后面,当我用 referer 向它发出请求时,我在输出中看到它:

proj master $ curl https://api.tentob.com/system/headers/ -H 'Referer: jaraco did it' {"Remote-Addr": "::1", "Host": "svc.example.com", "X-Real-Ip": "99.99.99.99", "X-Forwarded-For": "99.99.99.99", "X-Forwarded-Host": "svc.example.com", "X-Forwarded-Proto": "https", "Connection": "close", "User-Agent": "curl/7.54.0", "Accept": "*/*", "Referer": "jaraco did it"}

所以你的实现看起来应该对我有用。

不过你要小心点。如您所见,攻击者可以 trivially-easy 提供他们想要的任何旧 Referer。