server {
listen 80;
server_name www.test.com;
location /a/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://192.168.0.1:8080/;
}
国外服务器 location /b/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://192.168.0.2:8080/;
}
....跳转写rewrite不就行了.
location /a/ {
rewrite http://192.168.0.1:8080/;
}
这样直接报错啊nginx: [emerg] invalid number of arguments in "rewrite" directive
他说的应该是请求转发。另外就算是rewrite,你的语法也是错误的。
@fising, 是的,主要是要跳转到不同服务器,找不到相关参考
你是想 30x 跳转还是反向代理?
,是反向代理,因为url里我希望保留自己输入的内容,比如www.test.com/a ,而不是被替换掉
之前搞定过....但是..没留下配置.....汗...
楼主何不直接绑定站点www.test.com
写个PHP
访问www.test.com/a 跳转到内网服务器192.168.0.1:8080
访问www.test.com/b 跳转到内网服务器192.168.0.2:8080
即可
,条件所迫,我这些都在路由上实现,让路由做前端向后台发请求,所以希望尽可能简单
return 302 http://192.168.0.1:8080/;
你这种写法没有问题,要注意的是 location 这样的写法优先级是比较低的。[1] 有可能被其他配置匹配到,看上去就没生效。
我测试了你这种写法是没问题的:
location /a/ {
proxy_pass http://www.douban.com/;
}
然后我的域名测试确实被反代了:
https://www.shiguanglu.com/a/
https://www.shiguanglu.com/a/online/12121314/
1. http://wiki.nginx.org/HttpCoreModule#location
,目标服务器里没有a b目录也行吗,我将配置最小化了,测试还是不行
proxy_pass 的值如果以 / 结尾就行,douban.com 也没有 a 目录。
你把你的步骤说下?或者有时候粗心大意比如改错配置文件、没有 reload 配置,都是有可能的。
,确实是,以/结尾应该就可以,但我这里偏偏出问题,我再找找,有更新再来这里贴出,主要自己属于半吊子,有需要了才学,来不及啊。谢谢你
「不成功」 <- 怎么个不成功?
更新一下,改成了下面的语句在访问时候到时可以添加后缀/a,刷新后被替换,有了点进步,但是还是没搞定. 目标服务器没有/a目录,浏览器输入www.test.com/a后,页面开启,浏览器地址变为www.test.com/cgi-bin/luci , 目标服务器的网页根目录有一个index.html,那个会跳转到/cgi-bin/luci
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass https://192.168.0.1:8080/;
proxy_redirect https://192.168.0.1:8080/ /a/;
}
, 就是浏览器里写入www.test.com/a后,浏览器会把a去掉,然后404错误,换言之,nginx去找了目标服务器里的a目录,但实际上,我在location里确实用了/结尾,但它还是去找
proxy_pass少break吧
,rewrite才有break的语法,proxy_pass没有的
更新一下,看来是目标服务器的问题,跳转到我目标服务器后,页面显示就不正常。如果跳转到douban等等外部网站就没问题,不折腾了,我还是维持xxx.test.com 这样的二级域名,每个写一个吧。
其实所有的一切都是为了ssl证书,因为通配符的证书太贵,为二级域名配置ssl的话每个网址都要买一个,本来想通过\a \b \c这样子目录的方式来代替,只有搁置计划了。感谢各位的帮助,虽然没有成功,还是学到了一些东西
rewrite至少需要两个参数。。第一个参数是你要把哪部分改写。。
晕- -
a 和b那里把最后一个斜杠删了
location /a {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
rewrite ^/openvpnmonitor/(.*)$ /$1 break;
proxy_pass http://192.168.5.198:81;
}
上一条rewrite那里写错了,是a,忘记改了……
a 和b那里把最后一个斜杠删了
location /a {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
rewrite ^/a/(.*)$ /$1 break;
proxy_pass http://192.168.5.198:81;
}
最后变相搞定了,我把nginx换了,也不用路由做反向代理了,而是转到内网一台机器上的apache做了反代,目前一切工作如预期的,完全满足了自己的要求,再次感谢各位
location /
{
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.0.1:80;
}
location /fileCenter
{
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.0.2:80/fileCenter;
}