V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
care
V2EX  ›  NGINX

请教个 nginx 的伪静态和同时 http 重定向到 https 的 rewrite 规则写法

  •  
  •   care · 2020-02-20 22:05:56 +08:00 · 3129 次点击
    这是一个创建于 1772 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于网站需要使用伪静态才能使用,所以写了一条规则

    location / {  
    
                    if (!-e $request_filename){
                    rewrite ^(.*)$ /index.php?/$1 last;
                    }
    
                    try_files $uri $uri/ =404;               
            }
    

    但是又想使用 https 访问网站,所以又写了一条 rewrite 规则,然后访问网站的时候就报重定向过多

    server {
            listen 80;
            listen [::]:80;
            server_name example.com;
            rewrite ^/(.*) https://example.com/$1 permanent;        
    }
    

    只要取消下面这个 rewrite 规则,访问就是正常的,请问各位大佬,代码应该如何优化能达到既能伪静态又能成功重定向 http 到 https ?

    14 条回复    2020-02-21 13:09:38 +08:00
    also24
        1
    also24  
       2020-02-20 22:15:18 +08:00
    上面的 rewrite 规则只需要写在 https 的 server 段

    下面的 rewrite 规则只需要写在 http 的 server 段
    also24
        2
    also24  
       2020-02-20 22:18:37 +08:00   ❤️ 1
    需要理解的是,你下面的 rewrite .... permanent;
    实质上是 redirect (重定向)。

    http 段落的配置只需要处理重定向的问题,
    至于重写的问题,交给 https 段落的配置来解决。

    http -> 重定向 -> https -> 重写 URL -> backend app
    nlzy
        3
    nlzy  
       2020-02-20 22:30:05 +08:00 via Android
    http 跳转 https 不需要 rewrite,直接 return 302 https://$host$request_uri;
    care
        4
    care  
    OP
       2020-02-20 22:30:35 +08:00 via iPhone
    @also24 解决了,非常感谢!
    logan66
        5
    logan66  
       2020-02-20 22:30:48 +08:00 via iPhone
    楼上说的不错,另 https 需要配置 ssl 证书,试试 certbot,监听 443 端口。
    care
        6
    care  
    OP
       2020-02-20 22:34:54 +08:00 via iPhone
    @nlzy return 是不是不太利于网站收录?不太了解,说错请见谅!
    care
        7
    care  
    OP
       2020-02-20 22:42:33 +08:00 via iPhone
    @logan66 感谢回复,已经用 acme.sh 申请并配置好了,按照 1 楼那位大哥说的成功解决了重定向过多的问题
    also24
        8
    also24  
       2020-02-20 22:47:43 +08:00
    @care #6
    rewrite .... permanent; 是 301 重定向 (永久重定向)
    return 302 https://$host$request_uri; 是 302 重定向(临时重定向)

    当然,return 也可以自选 301 / 302 / 303 / 307 / 308 .....
    不同代码的含义详见: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Redirections


    对于搜索引擎收录方面来说:
    一般认为 301 会导致搜索引擎把两个链接视为同一个,从而剔除旧链接导致收录减少。
    但是这个主要针对多个不同域名下,你的场景是同域名不同协议,按道理来说不会涉及这个。
    care
        9
    care  
    OP
       2020-02-20 23:02:10 +08:00 via iPhone
    @also24 谢谢老哥的耐心解惑!
    ysc3839
        10
    ysc3839  
       2020-02-20 23:42:43 +08:00 via Android   ❤️ 2
    这是典型的错用 rewrite,rewrite 应该仅在复杂路径的情况下使用,这种“匹配任意 uri”的情况可以用 try_files 替代。try_files 已经有了判断文件是否存在的功能,所以开头的规则可以改成 try_files $uri $uri/ /index.php?/$request_uri;

    https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites
    care
        11
    care  
    OP
       2020-02-21 09:00:53 +08:00 via iPhone
    @ysc3839 谢谢,我了解一下。
    xytoki
        12
    xytoki  
       2020-02-21 11:22:09 +08:00
    不一定需要区分两个 server 段,用这个也行。
    if $http_scheme = "http" {
    rewrite ^/(.*) https://example.com/$1 permanent;
    }
    (伪代码,大概这样。)
    care
        13
    care  
    OP
       2020-02-21 12:11:04 +08:00 via iPhone
    @xytoki 好像很多人都不太推荐在 nginx 里使用 if 语句
    xytoki
        14
    xytoki  
       2020-02-21 13:09:38 +08:00
    @care 确实有人不推荐。我个人某些情况下分两个 server 区段可能不够方便的时候就会选择用 if。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   959 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:04 · PVG 04:04 · LAX 12:04 · JFK 15:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.