NGINX将HTTPS从任何域转发到特定的URL

时间:2019-04-10 19:28:50

标签: nginx

我正在使用针对bind9的DNSRBL列表来实现内部DNS服务器,以阻止对恶意网站的特定DNS请求。只要有匹配项,DNS服务器就会使用提供阻止页面的内部NGINX服务器的IP进行响应。

例如,当内部客户端请求http://www.badsite.com/时,DNS服务器以192.168.0.100作为响应,这是NGINX服务器的IP。然后NGINX使用301将请求转发到HTTPS站点,该站点将阻止页面消息提供给最终用户。

使用简单的NGINX配置,效果很好:

server {
        listen 80 default_server;
        server_name _;
        return 301 https://block.xyz.com;
}
server {
        listen 443 ssl;
        server_name block.xyz.com;    
        ssl_certificate /etc/letsencrypt/live/block.xyz.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/block.xyz.com/privkey.pem;    
        root /var/www/html;
        index index.html;
        location / {
               try_files $uri $uri/ =404;
        }    
}

我遇到的问题是客户端请求HTTPS站点时,即:https://www.badsite.com/。我想将所有传入的SSL / 443请求转发到https://block.xyz.com。我尝试添加以下指令:

server {
        listen 443 ssl default_server;
        server_name _;    
        ssl_certificate /etc/letsencrypt/live/block.xyz.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/block.xyz.com/privkey.pem;
        return 301 https://block.xyz.com;
}

我得到一个典型的SSL错误,说证书与域不匹配:NET :: ERR_CERT_COMMON_NAME_INVALID,这是可以理解的。当我将指令从return更改为rewrite时,会发生同样的事情:

...
rewrite ^ https://block.xyz.com;
....

我该如何在NGINX中添加指令来完成此任务?这份指南(https://sweetcode.io/ad-blocking-with-local-dns-servers-and-nginx/)为我提供了一种方法,可以在http端实现类似于广告拦截的功能,但不会使用https请求。

有任何线索吗?

1 个答案:

答案 0 :(得分:1)

在您的server块中,尝试添加:

        if ($host != "block.xyz.com") {
           rewrite ^/(.*) https://block.xyz.com/$1 permanent;
        }