You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:31:25