我正在将我的旧网站移至新域名,新域名带来了新的命名约定。我正在尝试找出针对大约 8 个不同页面实现以下操作的最简单方法:
http
到https
- 不同的域名
- 将 (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。