我试图将一个促销子域附加到我的网站上,该网站已经在https上,然后使用重定向url重定向到网站的另一个页面。如。基本上,如果我的网站是https://example.com
,并有一个页面https://example.com/xyz/xyz/promo
,那么我想要一个浏览器重定向,当我在https://promo.example.com
输入到这个页面。我已经设置了所有相关的AWS route 53设置。
我的nginx服务器块有这个
server {
listen 80 default_server;
listen [::]:80 default_server;
return 301 https://example.com$request_uri;
}
server {
server_name www.example.com;
return 301 https://example.com$request_uri;
}
server {
server_name example.com;
return 301 https://example.com$request_uri;
}
server {
server_name promo.example.com;
return 301 https://example.com/xyz/xyz/promo;
}
ssl_certificate /..path/..;
ssl_certificate_key //..path/..;
ssl_dhparam /..path/...;
ssl_trusted_certificate /..path/..;
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
ssl_prefer_server_ciphers on;
ssl_ciphers .......; //hidden
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_buffer_size 1400;
spdy_headers_comp 0;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=86400;
resolver_timeout 10;
server {
listen 443 ssl spdy;
server_name example.com;
include /etc/nginx/helper.conf;
root /var/www/example/ ;
index index.php index.html;
charset utf-8;
location / {
add_header "Access-Control-Allow-Origin" "*";
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ '.php$ {
fastcgi_split_path_info ^(.+'.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
location ~ /'.ht {
deny all;
}
}
当前行为:
当我直接输入promo.example.com
而没有 https时,它会正确重定向。但如果我输入https://promo.example.com
它会显示example.com, url是https://promo.example.com
预期行为:
如果我输入https://promo.example.com
,它应该重定向到https://example.com/xyz/xyz/promo
我不能把https://promo.example.com
然后重定向与服务器块,因为nginx抛出一个错误。
如何将https://promo.example.com
重定向到https://example.com/xyz/xyz/promo
由于使用Strict-Transport-Security报头,浏览器会自动提供301重定向,所以这个服务器块从未被使用过:
server {
server_name promo.example.com;
return 301 https://example.com/xyz/xyz/promo;
}
端口重定向80->443发生在浏览器连接到服务器之前,所以Nginx总是基于端口443提供最新的服务器块。这应该对您有所帮助:
server {
listen 443 ssl;
listen 80;
server_name promo.example.com;
return 301 https://example.com/xyz/xyz/promo;
}
试试这个:
server {
server_name promo.example.com;
rewrite ^ https://example.com/xyz/xyz/promo permanent;
每个服务器都可以有一个https实例,在这种情况下是example.com,因此当https前缀到任何url时,无论url是什么,用户都被重定向到example.com。
要使用https将用户重定向到预期的url,您需要为该站点提供单独的端口或单独的IP。
根据http://nginx.org/r/listen, listen指令的默认值是listen *:80 | *:8000;
。
如果指令不存在,那么如果nginx以超级用户权限运行,则使用*:80,否则使用*:8000。
因此,您提供的代码片段对https连接根本没有影响,因为它们不适用于通过ssl的端口443。
您没有提供ssl配置片段,也没有提供证书详细信息,以便我们为您提供完整的答案,但是一旦理解了以上内容,答案可能会发挥作用。
你可以参考http://nginx.org/en/docs/http/configuring_https_servers.html#single_http_https_server关于配置一个服务器来处理HTTP和HTTPS请求。
注:一般来说,HTTPS本身不能很好地规划子域,除非您支付了额外的费用,否则您的证书可能不包括任何子域,这意味着如果您或您的用户试图通过https://
地址方案访问此类站点,将导致浏览器警告。
有两种方法可以解决这个问题:
-
*.example.com有一个通配符证书,这样所有子域名可以共享相同的证书
-
在不同的IP地址上运行每个SSL站点。这样,web服务器就知道它可以向浏览器发送哪个SSL证书。