如何将所有 Web 请求重定向到 Nginx 上的特定子域?

如何将所有 Web 请求重定向到 Nginx 上的特定子域?

我有一个网站,我只想在以下位置处理请求:

abc.mywebsite.com

我希望任何请求能够:

www.mywebsite.com
mywebsite.com
<anything that is not abc>.mywebsite.com

指向abc.mywebsite.com,因为我有专门用于此的证书。我该如何编写 conf 文件来实现这一点?

这是我的配置文件:

server {
        listen 80 default_server;
        listen [::]:80 adefault_server;
        server_name _;
        return 301 https://$host$request_uri;
}

server {
    listen   443 default ssl;
    server_name abs.mywebsite.com;

    ssl    on;
    ssl_certificate    /etc/nginx/bundle.crt;
    ssl_certificate_key    /etc/nginx/abc.mywebsite.com.key;

    ssl_session_timeout  5m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;


    root /home/mywebsite/public;

    try_files $uri/index.html $uri @app;

答案1

您需要default_server为 HTTP 和 HTTPS 设置一个块。该块将处理您的重定向。

它看起来会像这样:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    return 301 https://abc.mywebsite.com$request_uri;
}

此块将任何请求重定向到任何虚拟主机和abc.mywebsite.com原始请求 URI。您可能希望删除request_uri,因为通常没有匹配的页面。

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    ... ssl_certificates here ...

    return 301 https://abc.example.com$request_uri;
}

此块将到达端口 443 的任何虚拟主机的所有请求重定向到abc.example.com原始 URI。使用 TLS,您需要拥有要重定向的域的有效证书,并且需要正确设置它们才能完全正常工作。

server {
    listen 443 ssl;

    server_name abc.example.com;

    ssl_certificate    /etc/nginx/bundle.crt;
    ssl_certificate_key    /etc/nginx/abc.mywebsite.com.key;

    ssl_session_timeout  5m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    root /home/mywebsite/public;

    try_files $uri/index.html $uri @app;
}

这是 的实际块abc.example.com

答案2

我将其添加到每个服务器块:

if ($host !~* ^abc\.mywebsite\.com$ ) {
    return 301 https://abc.mywebsite.com$request_uri;
}

而且它完全按照我的要求工作。我知道有些人不喜欢if声明。那么它们为什么在那里呢?工作完美。

相关内容