1. HTTP -> HTTPS

1. HTTP -> HTTPS

我正在将我的旧网站移至新域名,新域名带来了新的命名约定。我正在尝试找出针对大约 8 个不同页面实现以下操作的最简单方法:

  1. httphttps
  2. 不同的域名
  3. 将 (1) 旧的 www 地址和 (2) 旧的非 www 地址以及 (3) 新的非 www 地址重定向至新的 www 地址

以下是旧域名中的两个旧页面:

Portfolio:

http://dcturanoinc.com/?dct=portfolio_expediting
http://www.dcturanoinc.com/?dct=portfolio_expediting

Services:

http://dcturanoinc.com/?dct=services_expediting
http://www.dcturanoinc.com/?dct=services_expediting

以下是新域名中的两个新页面:

Services:

https://dcturano.com/services/
https://www.dcturano.com/services/

Portfolio:

https://dcturano.com/portfolio/
https://www.dcturano.com/portfolio/

编辑:这是我当前的 nginx.conf 文件。

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

    server_name dcturano.com www.dcturano.com;

    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }

答案1

1. HTTP -> HTTPS

为了自动检测 HTTP 与 HTTPS,我将使用 2 个独立的server块:

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

    # Redirect to HTTPS
}

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

    # Serve content
}

重定向将通过使用return 301而不是使用 来完成rewrite,如果可以避免则不鼓励使用。

2. www.domain -> 域名

现在要将 www 重定向到非 www,我会使用map,避免使用if

map $host $new_host {
    "~*^www\.(?<domain>.+)$"    $domain;
    default                     $host;
}

然后$new_host结合使用return 301

3. ?dct=portfolio_ -> ?dct=services_

最后,要将旧域名重定向到新域名,它是@wurtel 提供的链接上解释的参数过滤类型,尽管我会再次使用地图而不是if

map $arg_dct $new_arg_dct {
    "~*^portfolio_(?<dct>.+)$"    services_$dct;
    default                       $arg_dct;
}

4. 一体化示例

http {
    map $host $new_host {
        "~*^www\.(?<domain>.+)$"    $domain;
        default                     $host;
    }

    map $arg_dct $new_arg_dct {
        "~*^portfolio_(?<dct>.+)$"    services_$dct;
        default                       $arg_dct;
    }

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

        return 301 https://$new_host/?dct=$new_arg_dct;
    }

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

        if ($new_host != $host) {
            # Used $scheme to show you its existence
            return 301 $scheme://$new_host/?dct=$new_arg_dct;
        }

        if ($new_arg_dct != $arg_dct) {
            # Used $scheme to show you its existence
            return 301 $scheme://$new_host/?dct=$new_arg_dct;
        }
    }
}

正如您所注意到的,这里实际上不需要使用单独的服务器,因为简单的return 301 https://[...]重定向就足够了。但是,如果 HTTP 请求从未到达正确的服务器,我会觉得更漂亮。如果您最终使用的服务不支持 HTTPS,它还有助于扩展您的配置。

至于参数,我完全按照你提供的示例进行操作。如果你希望有一些其他你不想触碰的参数,并且想要以通用方式重定向,你可能需要链接几个map(或使用if 如果你知道自己在做什么) 重写该$args变量,最终得到一个重写的构造并准备发送到重定向 URL。

相关内容