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

Nginx 重定向 HTTP -> HTTPS 的问题

  •  
  •   stephCurry · 2020-09-01 21:43:35 +08:00 · 1913 次点击
    这是一个创建于 1303 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求主要是将 http 改为 https 的请求;由于是内部访问的,所以并不是标准的 80 -> 443 端口,而是直接将原地址加端口改为 https 的;
    现自己配置的my.domain.conf如下:

    server {
        server_name mydomain.com;
        listen 9000 ssl;
    
        if ($host != 'mydomain.com'){
    	     return 444;
        }
        
        ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; 
        ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; 
        include /etc/letsencrypt/options-ssl-nginx.conf; 
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 
        error_page 497 301 =307 https://$host:$server_port$request_uri;
    
        location /{
            proxy_pass http://localhost:8080;
            proxy_redirect off;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Ssl on;
        }
    
    }
    
    server {
        listen 9000;
        server_name mydomain.com;
        if ($host = 'mydomain.com') {
            return 301 https://$host:$server_port$request_uri;
        } 
        return 404; 
    }
    

    虽然能解决此需求,但是怎么感觉怪怪的有问题,还请大家指出,同时,也有几点疑问点想请教下大家:

    1. 我本地的 8080 端口(当然还有其他端口,有 java,有 node 服务),通过proxy_pass方式是否合理,但是感觉配置 tomcat ssl 里好像更恶心(现在也都是 springboot )?
    2. 因为所有 http 的要改为 https 的,那么每个对外的服务端口都得这样写,有没有办法直接转发 http -> https? Nginx conf 文件 server 结构都有 listen 属性不太好搞;
    3. 关于上面配置的最后一行,http 9000 端口的,如果 host 不为我指定的域名的话,应该是走 404 not found 页面,但是,如果不在 https server 部分加 if ($host != 'mydomain.com'){ return 444; } 的话,直接通过 ip 访问还是能访问的,并没有走到预期的 Nginx 404 页面;

    以上问题,还请不吝赐教
    另,版本 nginx/1.10.3

    Tink
        1
    Tink  
       2020-09-02 00:31:43 +08:00 via Android
    http 和 https 都监听 9000 端口?还能这样吗
    julyclyde
        2
    julyclyde  
       2020-09-02 09:39:00 +08:00
    @Tink 可以
    julyclyde
        3
    julyclyde  
       2020-09-02 09:41:10 +08:00
    if 条件不对,不应该判断 host header 而应该判断是否 ssl
    $https
    $schema
    这俩变量
    stephCurry
        4
    stephCurry  
    OP
       2020-09-02 10:00:05 +08:00
    @julyclyde 事实上,这个配置文件可以,但是还是不知道为什么通过 IP 直接访问 http 9006,应该不执行 return 301, 而是直接 404 啊,但实际上还是能直接访问,直到 https 里加了判断$host
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5421 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:40 · PVG 16:40 · LAX 01:40 · JFK 04:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.