我正在尝试将促销子域名附加到我的网站上,该网站已经在https上,然后使用重定向网址重定向到网站中的另一个网页。例如,基本上如果我的网站是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,其网址为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
答案 0 :(得分:5)
由于使用了 Strict-Transport-Security 标头,浏览器会自动提供301重定向,因此从未使用此服务器块:
SimpleAuth
端口重定向80-> 443甚至在连接到服务器的浏览器之前发生,因此Nginx总是根据端口443提供最新的服务器块。这可以帮助您:
server {
server_name promo.example.com;
return 301 https://example.com/xyz/xyz/promo;
}
答案 1 :(得分:3)
试试这个:
server {
server_name promo.example.com;
rewrite ^ https://example.com/xyz/xyz/promo permanent;
答案 2 :(得分:2)
每个服务器都可以有一个https实例,在本例中是example.com,因此当https作为任何网址的前缀时,无论网址如何,用户都会被重定向到example.com。
要让用户使用https重定向到目标网址,您需要为该网站设置单独的端口或单独的IP。
答案 3 :(得分:2)
根据http://nginx.org/r/listen,listen指令的默认值为listen *:80 | *:8000;
。
如果指令不存在,那么如果nginx以超级用户权限运行,则使用*:80,否则使用*:8000。
因此,您提供的代码段对https连接完全没有影响,因为它们不会通过ssl应用于端口443。
您还没有提供您的ssl配置片段,也没有提供证书详细信息,以便我们为您提供完整的答案,但一旦理解了上述内容,答案就可能有用。
关于配置单个服务器以处理HTTP和HTTPS请求,您可以参考http://nginx.org/en/docs/http/configuring_https_servers.html#single_http_https_server。
P.S。一般情况下,HTTPS本身并不能很好地规划子域名,除非您已经支付额外费用,否则您的证书可能无法覆盖任何子域名,这意味着它会导致浏览器如果您或您的用户尝试通过https://
地址方案访问此类网站,请发出警告。
答案 4 :(得分:1)
有两种方法可以解决这个问题:
拥有* .example.com的通配符证书,因此所有子域都可以共享相同的证书。
在不同的IP地址运行每个SSL站点。这样,Web服务器就知道它可以向浏览器发送哪个SSL证书。 - 检查收到传入连接的IP地址。