我的代理服务器在 ip A 上运行,这就是人们访问我的 Web 服务的方式。nginx 配置将重定向到 ip B 上的虚拟机。
对于 IP A 上的代理服务器,我的站点中有此可用
server {
listen 443;
ssl on;
ssl_certificate nginx.pem;
ssl_certificate_key nginx.key;
client_max_body_size 200M;
server_name localhost 127.0.0.1;
server_name_in_redirect off;
location / {
proxy_pass http://10.10.0.59:80;
proxy_redirect http://10.10.0.59:80/ /;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
rewrite ^(.*) https://$http_host$1 permanent;
server_name localhost 127.0.0.1;
server_name_in_redirect off;
location / {
proxy_pass http://10.10.0.59:80;
proxy_redirect http://10.10.0.59:80/ /;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Run Code Online (Sandbox Code Playgroud)
该proxy_redirect是取自我如何才能nginx的通过重写转发HTTP POST请求?
由于重写,所有命中公共 IP 的内容都会命中 443。在内部,我们在虚拟机上转发到 80。
但是当我运行像下面这样的 python 脚本来测试我们的配置时
import requests
data = {'username': '....', 'password': '.....'}
url = 'http://IP_A/api/service/signup'
res = requests.post(url, data=data, verify=False)
print res
print res.json
print res.status_code
print res.headers
Run Code Online (Sandbox Code Playgroud)
我得到了一个405 Method Not Allowed. 在 nginx 中,我们发现当它访问内部服务器时,内部 nginx 正在收到GET请求,即使在原始标头中我们做了一个POST(这在 Python 脚本中显示)。
所以看起来重写有问题。知道如何解决这个问题吗?当我注释掉重写时,它肯定达到了 80,并且通过了。由于 rewrite 能够与我们的内部服务器通信,因此 rewrite 本身没有问题。这只是重写下降POST到GET.
谢谢!
(这也会在 Nginx 论坛上被问到,因为这是一个关键的拦截器......)
c2h*_*5oh 11
这不是 Nginx,而是你的浏览器。
来自 RFC2616 的注释:
RFC 1945 和 RFC 2068 指定不允许客户端更改重定向请求的方法。但是,大多数现有的用户代理实现将 302 视为 303 响应,对位置执行 GET [..]
这适用于所有流行的浏览器,您对此无能为力。
小智 5
TL;DR 如果您想完全重定向到新资源并且请求的方法和正文不应更改,请使用 308 而不是 301 或 302。
301 是永久重定向,但 302 是临时重定向,因此使用 302 时搜索引擎不会更改与该网站关联的 URL。301 和 302 表示方法和主体不应更改,但并非所有用户代理都符合这一点。请阅读 Mozilla 的解释:
超文本传输协议 (HTTP) 302 Found 重定向状态响应代码表示请求的资源已暂时移动到 Location 标头给出的 URL。浏览器重定向到此页面,但搜索引擎不会更新其资源链接(在“SEO 术语”中,据说“链接汁”不会发送到新 URL)。即使规范要求在执行重定向时不得更改方法(和主体),但并非所有用户代理都符合此处 - 您仍然可以在那里找到此类存在缺陷的软件。因此,建议仅将 302 代码设置为 GET 或 HEAD 方法的响应,并使用 307 临时重定向,因为在这种情况下明确禁止方法更改。如果您希望将使用的方法更改为 GET,请改用 303 See Other。当您想要对 PUT 方法提供响应,该响应不是上传的资源而是一条确认消息(例如:“您已成功上传 XYZ”)时,这非常有用。
308和307都重定向到新资源,但它们保证请求的主体和方法不会改变。区别在于308是永久性的,而307是临时性的,因此308将向搜索引擎发出信号以更改网址。看看这个:
307和302唯一的区别是307保证重定向请求时方法和主体不会改变。对于 302,一些旧客户端错误地将方法更改为 GET:使用非 GET 方法和 302 的行为在 Web 上是不可预测的,而使用 307 的行为是可预测的。对于 GET 请求,它们的行为是相同的。
| 归档时间: |
|
| 查看次数: |
32260 次 |
| 最近记录: |