Nginx反向代理下如何从CherryPy.request获取请求来源域名?
解决CherryPy在Nginx反向代理下无法获取Referer的问题
你的问题核心是Nginx反向代理时没有将原始请求的Referer头传递给CherryPy,完全可以解决,只需要调整Nginx配置并确保CherryPy正确接收转发的请求头即可,具体步骤如下:
1. 修改Nginx配置,确保传递Referer头
默认情况下Nginx不会主动显式转发所有请求头,你需要在反向代理的location块中添加指令,强制传递客户端发送的原始Referer头:
location / { # 保留你原有的反向代理配置(比如proxy_pass http://your-cherrypy-server:port;) proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; # 关键:添加这一行,完整转发原始请求的Referer头 proxy_set_header Referer $http_referer; }
2. 配置CherryPy信任反向代理
如果你的CherryPy还未配置信任反向代理的转发头,需要开启tools.proxy工具,确保CherryPy正确识别来自Nginx的合法转发请求(这一步主要保障Host/IP相关头的正确性,同时让整体配置更规范):
import cherrypy class YourApp: # 你的业务逻辑代码 pass if __name__ == '__main__': cherrypy.config.update({ 'tools.proxy.on': True, # 可选:指定信任的Nginx IP,提升安全性(比如你的Nginx在本地就填127.0.0.1) # 'tools.proxy.remote': '127.0.0.1' }) cherrypy.quickstart(YourApp())
3. 复用并优化原有代码
完成上述配置后,你原来的代码就能正常获取Referer头了,注意Python3中urlparse模块已迁移到urllib.parse下,优化后的代码如下:
import cherrypy from urllib.parse import urlparse referer = cherrypy.request.headers.get('Referer', '/').lower() domain = urlparse(referer).netloc if domain in ('mysite.org', 'whitelistedsite.com'): # 执行你的业务逻辑 pass
额外排查技巧
如果仍然无法获取Referer,可以按以下步骤定位问题:
- 在Nginx的
access_log配置中添加$http_referer字段,确认客户端请求是否真的携带了Referer(部分浏览器在直接访问时不会发送Referer头) - 检查Nginx是否配置了
valid_referers,该指令可能会在Referer不匹配时清空头信息,需要调整或移除相关配置
内容的提问来源于stack exchange,提问作者Marc Maxmeister
相关产品推荐
相关产品推荐

