V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Bwoywan
V2EX  ›  问与答

请教关于 Nginx 的 location 配置文件写法。

  •  
  •   Bwoywan · 2019-09-21 16:24:44 +08:00 · 1794 次点击
    这是一个创建于 1891 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想要实现的功能就是域名目录反代一个 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; }                                                     
          }
    
    10 条回复    2019-09-23 21:11:04 +08:00
    ysoserious
        1
    ysoserious  
       2019-09-21 16:33:16 +08:00
    我是这么做的, 局域网里服务器 ip 地址是 192.168.35.9

    我就把域名在服务商那里解析到 192.168.35.9

    然后 nginx 配置像在公网时候的一样

    ssl 用的很舒服
    ochatokori
        2
    ochatokori  
       2019-09-21 16:36:16 +08:00 via Android   ❤️ 1
    proxy_pass http://127.0.0.1:5622/;
    试试看?
    MonoLogueChi
        3
    MonoLogueChi  
       2019-09-21 16:52:14 +08:00 via Android
    如果不是特别低的版本,直接写 /tt 就可以,不需要写 /tt/
    不建议指定代理协议,proxy_method 删掉
    你把 proxy_pass 写在前面
    如果不是必要那些 pass 什么的不要写,默认就好
    最后你再确认一下你的路径写的对不对,别忘了还有一层 tt,你的 typecho 的路由也要带上 /tt/
    ryd994
        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 解决
    zhuangjia
        5
    zhuangjia  
       2019-09-21 17:22:38 +08:00   ❤️ 1
    ochatokori,ryd994 说的对

    header 的问题可以先尝试将 proxy_pass 放在配置最上面,然后再 proxy_set_header
    Bwoywan
        6
    Bwoywan  
    OP
       2019-09-21 20:52:29 +08:00
    @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/
    ryd994
        7
    ryd994  
       2019-09-22 01:04:44 +08:00 via Android   ❤️ 1
    @Bwoywan 页面内容里的链接靠 sub_filter
    301/302 目标靠 proxy_redirect
    ryd994
        8
    ryd994  
       2019-09-22 01:08:21 +08:00 via Android   ❤️ 1
    @MonoLogueChi
    @zhuangjia
    指令顺序无关。Nginx 配置是 declarative 的,实际执行顺序由相关模块的处理 stage 决定。同是 proxy 模块就不存在先后顺序。
    少数可以重复指定的指令,会有自己的先后顺序。
    MonoLogueChi
        9
    MonoLogueChi  
       2019-09-22 12:35:27 +08:00 via Android   ❤️ 1
    @ryd994 这里和顺序无关,就是写在后面看着别扭
    Bwoywan
        10
    Bwoywan  
    OP
       2019-09-23 21:11:04 +08:00 via Android
    @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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4154 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:26 · PVG 13:26 · LAX 21:26 · JFK 00:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.