请教各位一个 nginx 的配置

207 天前
 a33291

当前,我希望使用 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?

1759 次点击
所在节点    NGINX
12 条回复
iloveayu
207 天前
不用 if ,给每个你要代的域名都单独配置 proxy pass
litchinn
207 天前
server {
server_name a.com;
listen 80;
location / {
proxy_pass xxxxx;
}
}
server {
server_name b.com;
listen 80;
location / {
proxy_pass xxxxx;
}
}


这样配置
ysc3839
207 天前
用多个 server 不行吗?
isbase
207 天前
a33291
207 天前
感谢各位的回复,目前通过这样配置解决了

```
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
207 天前
@a33291 证书可以配置在 server 上级的 http 里面啊,到底有什么需求?
fyzhh
207 天前
通过 nginx 来访问 a.com 是不是算正向代理
Hanada
207 天前
location / {

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

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

}
xiebruce
207 天前
@fyzhh 不算,只有在你电脑中去代理才叫正向,服务器端去代理就是反向(虽然反向代理的目标是另一个网站),当然对服务器本身来说,这个代理是正向。
a33291
206 天前
@Hanada 取反的确也可以 😀
a33291
206 天前
@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
206 天前

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/981953

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX