今天接到一个需求,前台要调用后台的短信发送网关:必须以post形式传递参数,并且前台的发送短信的请求的url和后台的发送短信的url不一致
前台的url为http://xxx.test.com/ajax/mobiledynamiclogincode
后台的发送短信网关的url为:
http://xxx2.test.com/json/account/mobiledynamiclogincode
分析:
1、nginx中的rewrite到外部url会导致post的参数丢失,所以放弃该方案。(内部的rewrit是不会丢失post数据)
原因:
(1)post的时候,参数是存放在message body中传递的,对于内部的url调转,因为是相同的一次请求,所以message body(request body)没变,所以post数据不会丢失。
(2)而对于外部跳转,实际上是一次302,即用户在请求了一次,所以第二次就不会post第一次的数据了。
具体如下:你post数据之后,匹配到rewrite之后,因为是外部的url,用户会看到一个302,之后请求的url就变成了get。。那么之前post的数据就丢失了(因为用户没有再提交一次数据)
2、需要传递post参数,需要使用proxy_pass。同时,因为proxy之前的url和proxy的url不同,需要做location,并需要在在proxy_pass中写全路径参考例子如下
思考了为啥proxy_pass能传递post的参数:因为对于用户而言,就只是一个请求,所以request body没变。nginx会将该request body传递到后续的server
location /ajax/mobiledynamiclogincode {
proxy_pass http://xxx2.test.com/json/account/mobiledynamiclogincode;
}
====================================================================
前几天搭了一个论坛服务器并放到了公司的局域网里面,论坛用的是9066端口并在路由器上面做了个端口转发,而且把bbs.xxx.com这个域名也指向了公司的公网IP,因为想让用户在访问的时候不用输入端口号于是就想在公司的web服务器上面做个跳转,将访问bbs.xxx.com的请求都转到他的服务器上面去。我第一个想法就是 用 nginx的rewrite,过程很简单 配置如下:
server {
listen 80;
server_name bbs.xxx.com;
rewrite "^/(.*)$" http://bbs.xxx.com:9066/$1 break;
}
于是访问bbs.xxx.com检查了一下,注册,登录发帖等等操作都正常,本以为这样就ok了,结果随后问题出现了,虽然能正常的跳转但是 用户浏览器的域名栏上的地址后面一直跟着 9066 这个端口号,这让领导很不满意,于是我找了下nginx的文档和在群问了下别的朋友,没有什么好办法。于是就改用了 proxy_pass,这个配置也很简单:
server {
listen 80;
server_name bbs.xxx.com;
location /
{
proxy_pass http://bbs.xxx.com:9066/;
}
}
然后再访问 bbs.xxx.com 后面的端口号就不在了,注册、登录、发帖都正常,可是不一会儿又出问题了,用户反映论坛无法注册,提示说“单一ip一天内只能注册5次”,这是怎么回事,通过检查日志后发现 所有公网发过来的请求竟然都是 网关的ip地址 ,这下我明白了简单的加了proxy以后如果不进一步设置的话 nginx是不会去判断真正的客户端ip的,而是直接把路由的地址作为请求ip,所以会出现上述情况,分析后查了下 nginx的wiki 于是就在上面又加了几条:
server {
listen 80;
server_name bbs.xxx.com;
location /
{
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://bbs.xxx.com:9066/;
}
}
改完以后 reload 了一下nginx,发现日志里面的源ip已经是真实的客户端地址了,重新注册,登录,发帖,都正常,重复了多次后没有发现问题,客户那里也都正常了。
http://storysky.blog.51cto.com/628458/486338/
http://h2ofly.blog.51cto.com/6834926/1320187/
相关推荐
- **多域名配置**:若需要实现多个子域名或不同形式的域名跳转到同一个主域名,则可以在同一个 server 块中配置多个 server_name 和 rewrite 规则。例如,下面的配置实现了 `wgkgood.gicp.net` 跳转到 `blog.mgcrazy...
Nginx在vhost里的配置站点,通过proxy转发到动态域名的具体配置。 反向代理,动态域名 ,Proxy
传统的页面跳转方法通常采用`rewrite`规则,但随着技术的发展,出现了一种新的跳转方式——通过`refresh`进行跳转。这种方式相比传统方法更为彻底且更安全快捷,被广泛应用在如百度、知乎等大型网站中。本文将详细...
Nginx 中 rewrite 实现二级域名、三级域名、泛域名、路径的重写 Nginx 中的 rewrite 模块是实现 URL 重写和.redirect 的强大工具。下面我们将详细介绍 Nginx 中如何使用 rewrite 实现二级域名、三级域名、泛域名、...
Nginx的强大功能还包括负载均衡、缓存管理、SSL/TLS支持等,proxy_redirect是我们在进行复杂的Web架构设计时经常用到的一个小工具。掌握如何正确和高效地使用proxy_redirect,能够帮助我们在保证Web应用安全和高效的...
此文比较详细讲述了Nginx与proxy共同搭建反向代理服务的配置方法
这里面的域名(http://192.168.45.1:8045)即是内部跳转的地址,将该内容拷贝多份实现不同来访域名的跳转) 如下: 3.找到D:\nginx\conf下nginx.conf文件用记事本打开 在文段末尾大括号前加上 include proxy.conf...
### Nginx Rewrite 常用示例解析 #### 一、从非-www 版本自动重定向到 www 版本 **应用场景:** 当用户访问 `abc.com`(无 www 的版本)时,需要自动重定向到 `http://www.abc.com`。 **配置示例:** ```nginx ...
本文将深入探讨Nginx的Rewrite规则,通过实例来展示其在实际场景中的应用,帮助读者更好地理解和掌握这一关键技能。 #### 一、Rewrite规则的基本语法 Rewrite规则主要通过`rewrite`指令实现,其基本语法结构如下:...
### 实例讲解Nginx的rewrite规则 #### 正则表达式匹配 在Nginx中,使用`rewrite`指令可以实现对URL的重写,其中涉及到正则表达式的匹配方式有以下几种: 1. **区分大小写的匹配**:使用`~`符号,例如:`rewrite ^/...
在Nginx服务器配置中,`rewrite`指令用于URL重写,这在创建动态到静态页面的重定向、实现URL路由、或者根据特定条件改变URL结构时非常有用。当URL中包含问号(`?`)以及参数时,处理起来可能会有些复杂,因为问号及其...
如果一个URL被重写后再次匹配到同一个location块,且这个location块还有Rewrite规则,那么Nginx会在达到设置的最大循环次数(默认为10)时停止重写,并返回500 Internal Server Error错误。 四、使用技巧与注意事项...
在LNMP集成环境中,如果使用的是预装的Nginx,例如在/usr/local/nginx/conf/目录下有一个名为"wordparss"的文件,这就是用来写入rewrite规则的地方。你可以在这个文件中按照Nginx的语法编写规则,它与Apache的`....
`proxy_pass`是Nginx的一个关键指令,它用于将客户端的请求转发到上游服务器,通常用于反向代理。例如,当Nginx接收到一个特定的URL请求时,它可以将这个请求传递给内部的Web服务器(如Apache、Tomcat或Node.js服务...
nginx多域名配置示例 php多级域名配置 二级域名配置示例 nginx伪静态示例
- **虚拟主机配置**:Nginx支持基于名称的虚拟主机,即通过不同的域名指向同一个IP地址下的不同网站。这对于多站点托管非常有用。 - **反向代理配置**:Nginx作为反向代理服务器时,可以通过`proxy_pass`指令将请求...
在IT行业中,域名跳转是一种常见的网络管理技术,主要用于根据用户设备的IP地址将请求重定向到特定的网站或服务器。这种技术在多种场景下都有应用,比如网站维护、地理位置定位服务、多语言站点管理等。标题“根据ip...