想要实现的功能就是域名目录反代一个 typecho 站点。
例如:https://domain.com/tt/
反代至本地的 http://127.0.0.1:5622
架构是 LNMP 一键安装包安装的 nginx 和 mysql, php,目前已经有一个 typecho 站点正常运行中。
尝试过几种写法,要么 404 ,要么 url header 会是 127.0.0.1:5622
希望 v 友 能指教一下,感谢。。。
~~想这么做的原因主要是这样就不用申请 ssl 证书了(~~
location /tt/ {
proxy_method GET;
proxy_pass_request_headers on;
proxy_pass_request_body on;
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://127.0.0.1:5622;
}
server {
listen 5622;
server_name 127.0.0.1;
include enable-php-pathinfo.conf;
location / {
root /home/wwwroot/typecho/;
index index.php,index.html;
# if (-f $request_filename/index.html) {
# rewrite (.*) $1/index.html break;
# }
# if (-f $request_filename/index.php) {
# rewrite (.*) $1/index.php;
# }
# if (!-f $request_filename)
# {
# rewrite (.*) /index.php; }
}
1
ysoserious 2019-09-21 16:33:16 +08:00
我是这么做的, 局域网里服务器 ip 地址是 192.168.35.9
我就把域名在服务商那里解析到 192.168.35.9 然后 nginx 配置像在公网时候的一样 ssl 用的很舒服 |
2
ochatokori 2019-09-21 16:36:16 +08:00 via Android 1
proxy_pass http://127.0.0.1:5622/;
试试看? |
3
MonoLogueChi 2019-09-21 16:52:14 +08:00 via Android
如果不是特别低的版本,直接写 /tt 就可以,不需要写 /tt/
不建议指定代理协议,proxy_method 删掉 你把 proxy_pass 写在前面 如果不是必要那些 pass 什么的不要写,默认就好 最后你再确认一下你的路径写的对不对,别忘了还有一层 tt,你的 typecho 的路由也要带上 /tt/ |
4
ryd994 2019-09-21 17:03:05 +08:00 1
1. ochatokori 是对的。
nginx 对于 proxy url 的替换规则是,如果只有 protocol 和 host proxy_pass http://127.0.0.1:5622; 则 path 部分原样传递,也就是 https://domain.com/tt/abc 会到 http://127.0.0.1:5622/tt/abc 如果有 path 部分 proxy_pass http://127.0.0.1:5622/; 则只替换到 location 指定部分的剩余部分 https://domain.com/tt/abc 会到 http://127.0.0.1:5622/abc 多出来的斜杠非常重要 2. url header 的问题靠 proxy_redirect 和 sub_filter 解决 |
5
zhuangjia 2019-09-21 17:22:38 +08:00 1
ochatokori,ryd994 说的对
header 的问题可以先尝试将 proxy_pass 放在配置最上面,然后再 proxy_set_header |
6
Bwoywan OP @ryd994 谢谢啦。
但是我现在还是有一个问题无法解决,还是关于 proxy_redirect 和 sub_filter 的用法,我如果 这样写 ``` proxy_pass http://127.0.0.1:5622/; proxy_set_header Host $host; proxy_redirect http://127.0.0.1:5622/ /tt/; ``` 并不会生效,页面中链接仍缺少 /tt/ |
7
ryd994 2019-09-22 01:04:44 +08:00 via Android 1
@Bwoywan 页面内容里的链接靠 sub_filter
301/302 目标靠 proxy_redirect |
8
ryd994 2019-09-22 01:08:21 +08:00 via Android 1
@MonoLogueChi
@zhuangjia 指令顺序无关。Nginx 配置是 declarative 的,实际执行顺序由相关模块的处理 stage 决定。同是 proxy 模块就不存在先后顺序。 少数可以重复指定的指令,会有自己的先后顺序。 |
9
MonoLogueChi 2019-09-22 12:35:27 +08:00 via Android 1
@ryd994 这里和顺序无关,就是写在后面看着别扭
|
10
Bwoywan OP @ryd994
@MonoLogueChi 抱歉打扰两位,遇到了我无法解决的问题。 目前前台主页已经正常,但是 登录页 无法登录, 我对比了一下没有反代的登录页,/admin/ 会有一个 301,并且 url 后面会带一个 refer 于是我以为是 refer 的问题,就在 location 里面加入了 proxy_set_header Referer $http_referer; 但是还是无法登陆。 目前的 location 配置如下: ''' location ^~ /hd/ { proxy_pass http://127.0.0.1:5623/; proxy_set_header Host $host; sub_filter http://$host https://$host/hd; sub_filter_once off; proxy_set_header Accept-Encoding ""; proxy_set_header Referer $http_referer; #proxy_redirect https://domain.com http://127.0.0.1:5623; ''' 反代页是 https://domain.com/hd 并且如果直接输入 https://domain.com/hd/admin 会重定向至 https://domain.com:5623/hd/admin |