【问题标题】:nginx handling redirects and rewrites of http and non-www urlsnginx 处理 http 和非 www url 的重定向和重写
【发布时间】:2019-09-27 02:02:48
【问题描述】:

我见过很多处理重定向 http://example.com 或 example.com(带或不带 www.)或 https://example.com 到 https://www.example.com 的方法。

我使用的方式是在这个nginx配置中:

error_log /dev/stdout info;

upstream django_server {
    server app:8001 fail_timeout=0;
}

server {
    listen 80;
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/certificate.chained.crt;
    ssl_certificate_key /etc/nginx/ssl/example.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

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

server {
    listen 80;
    server_name www.example.com;

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

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

server {
    listen 443 default_server ssl;
    server_name www.example.com;
    client_max_body_size 4G;
    charset utf-8;
    keepalive_timeout 70;

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

    gzip on;
    gzip_http_version 1.1;
    gzip_disable "MSIE [1-6]\.";
    gzip_min_length 256;
    gzip_vary on;
    gzip_proxied expired no-cache no-store private auth;
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss;
    gzip_comp_level 9;

    ssl_certificate /etc/nginx/ssl/certificate.chained.crt;
    ssl_certificate_key /etc/nginx/ssl/example.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    location /static/ {
        root /usr/share/nginx/sasite/;
        expires 30d;
        autoindex off;

        location /static/download/ {
            location ~* \.(pdf|docx|zip|rar)$ {
                add_header Content-Disposition 'attachment; filename="$request_filename"';
            }
        }
    }
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_redirect off;
        if (!-f $request_filename) {
            proxy_pass http://django_server;
            break;
        }
    }
}

但我也看到了多个 server_name 值设置如下的版本:

server {
    listen 80;

    server_name example.com www.example.com;

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

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

server {
    listen 443 default_server ssl;
    server_name example.com www.example.com;
    client_max_body_size 4G;
    charset utf-8;
    keepalive_timeout 70;

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

    ssl_certificate /etc/nginx/ssl/certificate.chained.crt;
    ssl_certificate_key /etc/nginx/ssl/example.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

}

我也看到了其他方法,但似乎没有那么有效。处理这种情况的实际理想方法是什么?我当前的配置有效,但我想了解最佳做法。

【问题讨论】:

  • 我更喜欢this approach,但我会像我写的那样。最佳方法取决于 IP 地址是处理许多不同的域还是仅处理单个域的变体。
  • @RichardSmith 我确实喜欢这种方法,但我有一个问题。在未设置 server_name 的块中设置 default_server 会实现什么? default_server 块何时会响应端口 443 上的请求?由于端口是在两个部分中定义的。
  • 标记为默认服务器的块将响应对与特定server_name 不匹配的任何主机名的请求。因此,所有指向您的 IP 地址的主机名,除了在另一个 server 块中指定的主机名。

标签: nginx


【解决方案1】:

这取决于偏好。您是否希望您的用户始终看到(或始终看不到)“www”。部分?如果是这样,请使用重定向方法。如果您不在乎他们是否看到,请使用多个 server_name/server_alias 条目。

【讨论】:

    猜你喜欢
    • 2017-09-03
    • 2015-10-23
    • 2016-04-02
    • 2018-02-02
    • 2016-05-20
    • 2017-03-10
    • 2018-09-26
    • 1970-01-01
    • 2016-01-07
    相关资源
    最近更新 更多