Django request.get_host()在哪里获取它';什么信息来自?(如何使其具有主机名,而不是IP?)
我有一个django实例,它使用apache和mod_wsgi在虚拟机上提供服务(不是由我管理) 我从Django request.get_host()在哪里获取它';什么信息来自?(如何使其具有主机名,而不是IP?),django,Django,我有一个django实例,它使用apache和mod_wsgi在虚拟机上提供服务(不是由我管理) 我从request.get\u host()(和build\u absolute\u uri())中获取的值是虚拟机的内部网络IP地址,而不是我用于发出HTTP请求的internet DNS主机名 django外部需要进行什么配置才能使django认为它的主机就是外部主机名 (目前我在settings.py中遇到了一个漏洞,我在其中写入主机名并使用它来构建URL等,作为一种解决方法)。如果您设置了d
request.get\u host()
(和build\u absolute\u uri()
)中获取的值是虚拟机的内部网络IP地址,而不是我用于发出HTTP请求的internet DNS主机名
django外部需要进行什么配置才能使django认为它的主机就是外部主机名
(目前我在settings.py中遇到了一个漏洞,我在其中写入主机名并使用它来构建URL等,作为一种解决方法)。如果您设置了django设置
use_X_FORWARDED_host
集,那么django将查找名为X-FORWARDED-host
的请求头并使用它
如果上述情况无法实现,django将使用Host
请求头
如果上述两种方法都不起作用(这种情况应该很少见),django将使用WSGI环境变量SERVER\u NAME
,它很可能是python应用程序服务器正在侦听的套接字的IPv4/v6地址
最有可能的情况是,您正在python服务器前面运行一个反向代理服务器,代理正在更改原始请求的主机头。如果是这种情况,您可能需要设置设置。在django中使用_X_FORWARDED_HOST,并告诉您的代理在
X-FORWARDED-HOST
中传递原始主机头。如果设置了django设置使用_X_FORWARDED_HOST
,django将查找名为X-FORWARDED-HOST
的请求头并使用它
如果上述情况无法实现,django将使用Host
请求头
如果上述两种方法都不起作用(这种情况应该很少见),django将使用WSGI环境变量SERVER\u NAME
,它很可能是python应用程序服务器正在侦听的套接字的IPv4/v6地址
最有可能的情况是,您正在python服务器前面运行一个反向代理服务器,代理正在更改原始请求的主机头。如果是这种情况,您可能需要设置设置。在django中使用_X_FORWARDED_HOST,并告诉您的代理在
X-FORWARDED-HOST
中传递原始主机头。如果设置了django设置使用_X_FORWARDED_HOST
,django将查找名为X-FORWARDED-HOST
的请求头并使用它
如果上述情况无法实现,django将使用Host
请求头
如果上述两种方法都不起作用(这种情况应该很少见),django将使用WSGI环境变量SERVER\u NAME
,它很可能是python应用程序服务器正在侦听的套接字的IPv4/v6地址
最有可能的情况是,您正在python服务器前面运行一个反向代理服务器,代理正在更改原始请求的主机头。如果是这种情况,您可能需要设置设置。在django中使用_X_FORWARDED_HOST,并告诉您的代理在
X-FORWARDED-HOST
中传递原始主机头。如果设置了django设置使用_X_FORWARDED_HOST
,django将查找名为X-FORWARDED-HOST
的请求头并使用它
如果上述情况无法实现,django将使用Host
请求头
如果上述两种方法都不起作用(这种情况应该很少见),django将使用WSGI环境变量SERVER\u NAME
,它很可能是python应用程序服务器正在侦听的套接字的IPv4/v6地址
最有可能的情况是,您正在python服务器前面运行一个反向代理服务器,代理正在更改原始请求的主机头。如果是这种情况,您可能需要设置设置。使用django中的\X\u FORWARDED\u HOST,并告诉您的代理在
X-FORWARDED-HOST
中传递原始主机头。我想稍微扩展一下ender672的答案
当您向Django发送请求时,在请求对象中有META arrtibute(request.META)
该属性是一个包含大量键/值的字典。以下是我的例子中的META:
看这幅画的结尾。你看到HTTP_X_主机了吗?那把钥匙是自动生成的。它将始终出现在这里,除非您开始更改请求类的源代码
所以服务器知道它的外部IP(您用来访问服务器),但它在Django内部不使用它,因为默认情况下使用\ux\uForwarded\uHost=False
。在这个场景中,它将使用request.META.HTTP_主机,您可以看到上面的图片
这就是为什么需要在Django设置中添加新行:
USE_X_FORWARDED_HOST = True
之后,它将开始用外部地址替换其内部地址。我想稍微扩展一下ender672的答案 当您向Django发送请求时,在请求对象中有META arrtibute(request.META) 该属性是一个包含大量键/值的字典。以下是我的例子中的META: 看这幅画的结尾。你看到HTTP_X_主机了吗?那把钥匙是自动生成的。它将始终出现在这里,除非您开始更改请求类的源代码 所以服务器知道它的外部IP(您用来访问服务器),但它在Django内部不使用它,因为默认情况下
使用\ux\uForwarded\uHost=False
。在这个场景中,它将使用request.META.HTTP_主机,您可以看到上面的图片
这就是为什么需要在Django设置中添加新行:
USE_X_FORWARDED_HOST = True
之后,它将开始用外部地址替换其内部地址。我想稍微扩展一下ender672的答案 当您向Django发送请求时,在请求对象中有META arrtibute(request.META) 那是一种措辞