请教各位一个 nginx 的配置

2023-10-14 14:48:02 +08:00
 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?

2105 次点击
所在节点    NGINX
12 条回复
iloveayu
2023-10-14 15:05:31 +08:00
不用 if ,给每个你要代的域名都单独配置 proxy pass
litchinn
2023-10-14 15:07:51 +08:00
server {
server_name a.com;
listen 80;
location / {
proxy_pass xxxxx;
}
}
server {
server_name b.com;
listen 80;
location / {
proxy_pass xxxxx;
}
}


这样配置
ysc3839
2023-10-14 15:07:54 +08:00
用多个 server 不行吗?
isbase
2023-10-14 15:19:39 +08:00
a33291
2023-10-14 15:21:17 +08:00
感谢各位的回复,目前通过这样配置解决了

```
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
2023-10-14 15:52:13 +08:00
@a33291 证书可以配置在 server 上级的 http 里面啊,到底有什么需求?
fyzhh
2023-10-14 19:15:22 +08:00
通过 nginx 来访问 a.com 是不是算正向代理
Hanada
2023-10-14 22:03:31 +08:00
location / {

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

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

}
xiebruce
2023-10-15 00:32:22 +08:00
@fyzhh 不算,只有在你电脑中去代理才叫正向,服务器端去代理就是反向(虽然反向代理的目标是另一个网站),当然对服务器本身来说,这个代理是正向。
a33291
2023-10-15 10:17:14 +08:00
@Hanada 取反的确也可以 😀
a33291
2023-10-15 10:21:15 +08:00
@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
2023-10-15 11:12:00 +08:00

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

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

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

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

© 2021 V2EX