由于网站需要使用伪静态才能使用,所以写了一条规则
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 ?
|  |      1also24      2020-02-20 22:15:18 +08:00 上面的 rewrite 规则只需要写在 https 的 server 段 下面的 rewrite 规则只需要写在 http 的 server 段 | 
|  |      2also24      2020-02-20 22:18:37 +08:00  1 需要理解的是,你下面的   rewrite  ....   permanent; 实质上是 redirect (重定向)。 http 段落的配置只需要处理重定向的问题, 至于重写的问题,交给 https 段落的配置来解决。 http -> 重定向 -> https -> 重写 URL -> backend app | 
|  |      3nlzy      2020-02-20 22:30:05 +08:00 via Android http 跳转 https 不需要 rewrite,直接 return 302 https://$host$request_uri; | 
|  |      5logan66      2020-02-20 22:30:48 +08:00 via iPhone 楼上说的不错,另 https 需要配置 ssl 证书,试试 certbot,监听 443 端口。 | 
|  |      7care OP | 
|  |      8also24      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 会导致搜索引擎把两个链接视为同一个,从而剔除旧链接导致收录减少。 但是这个主要针对多个不同域名下,你的场景是同域名不同协议,按道理来说不会涉及这个。 | 
|  |      10ysc3839      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 | 
|      12xytoki      2020-02-21 11:22:09 +08:00 不一定需要区分两个 server 段,用这个也行。 if $http_scheme = "http" { rewrite ^/(.*) https://example.com/$1 permanent; } (伪代码,大概这样。) |