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

请教各位一个 nginx 的配置

  •  
  •   a33291 · 196 天前 · 1732 次点击
    这是一个创建于 196 天前的主题,其中的信息可能已经有所发展或是发生改变。

    当前,我希望使用 nginx 反向代理几个域名以便可以让内网访问 比如 a.com b.com

    目前我发现这样配置

    location / {
                
                default_type text/html;
    
                if ($host ~* a.com$) {
                    proxy_pass $scheme://$host;
                }
    
                return 404;
            }
    

    即使请求的是 a.com 也会返回 404,如果注释掉return 404时,则访问 a.com 时正常,访问其他域名会返回 nginx 默认页面.

    请问如何配置才能让这个 if 短路提前 return,而不是继续走到后边的 return 404?

    12 条回复    2023-10-15 11:12:00 +08:00
    iloveayu
        1
    iloveayu  
       196 天前 via iPhone   ❤️ 1
    不用 if ,给每个你要代的域名都单独配置 proxy pass
    litchinn
        2
    litchinn  
       196 天前   ❤️ 1
    server {
    server_name a.com;
    listen 80;
    location / {
    proxy_pass xxxxx;
    }
    }
    server {
    server_name b.com;
    listen 80;
    location / {
    proxy_pass xxxxx;
    }
    }


    这样配置
    ysc3839
        3
    ysc3839  
       196 天前 via Android   ❤️ 1
    用多个 server 不行吗?
    a33291
        5
    a33291  
    OP
       196 天前
    感谢各位的回复,目前通过这样配置解决了

    ```
    location / {
    default_type text/html;

    set $flag 0;

    # 此处使用正则设置允许的域名
    if ($host ~* (a.com|b.com)$) {
    set $flag 1;
    }

    if ($flag = 1) {
    proxy_pass $scheme://$host;
    }
    if ($flag = 0) {
    #return 404;
    }
    }
    ```

    相当于模拟了一下 if else

    因为基本 server 的配置都一样(比如证书相关),所以拆成多个 server 会导致配置大量重复,容易出错,所以希望在一个 server 内解决.

    再次感谢各位
    ysc3839
        6
    ysc3839  
       196 天前 via Android
    @a33291 证书可以配置在 server 上级的 http 里面啊,到底有什么需求?
    fyzhh
        7
    fyzhh  
       196 天前 via iPhone
    通过 nginx 来访问 a.com 是不是算正向代理
    Hanada
        8
    Hanada  
       196 天前 via Android   ❤️ 1
    location / {

    default_type text/html;
    proxy_pass $scheme://$host;

    if ($host !~* a.com$) {
    return 404;
    }

    }
    xiebruce
        9
    xiebruce  
       196 天前
    @fyzhh 不算,只有在你电脑中去代理才叫正向,服务器端去代理就是反向(虽然反向代理的目标是另一个网站),当然对服务器本身来说,这个代理是正向。
    a33291
        10
    a33291  
    OP
       195 天前
    @Hanada 取反的确也可以 😀
    a33291
        11
    a33291  
    OP
       195 天前
    @ysc3839 #6 是的,找了一下资料发现可以在 http 一级设置默认证书,server 不配置则回退到 http 一级的证书配置.此外还有一些跨域和 header 的配置不确定是否都可以在 http 一级设置,示例如下
    ```
    listen 443 ssl;
    ssl_certificate ../certs/localhost.pem;
    ssl_certificate_key ../certs/localhost.key;
    ssl_session_timeout 5m;
    ssl_prefer_server_ciphers On;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

    charset utf8;

    if ($http_origin = ''){
    set $http_origin "*";
    }

    proxy_hide_header Access-Control-Allow-Origin;
    add_header Access-Control-Allow-Origin $http_origin;
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
    add_header Access-Control-Expose-Headers 'Content-Length,Content-Range';

    # multi-thread( https)
    add_header Cross-Origin-Opener-Policy 'same-origin';
    add_header Cross-Origin-Embedder-Policy 'require-corp';
    ```

    真正的需求就是内网想要访问公网一些网站(只有部分域名允许,其他均不允许),所以此时有一台服务器(双网卡同时接内网和公网)用 nginx 来做代理,内网修改 hosts 域名指向这台服务器,然后内网的机器就直接访问对应域名的网站.
    ysc3839
        12
    ysc3839  
       195 天前 via Android
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1539 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 16:50 · PVG 00:50 · LAX 09:50 · JFK 12:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.