我正在试图附加一个促销子域名到我的网站已经在https上,然后使用redirecturlredirect到网站中的另一个页面。 例如,基本上如果我的网站是https://example.com
并有一个页面https://example.com/xyz/xyz/promo
然后我想浏览器redirect时,我inputhttps://promo.example.com
到这个页面。 我已经设置了所有相关的AWS路由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时,它会正确redirect。 但是,如果我inputhttps://promo.example.com
它只显示我example.com,URL是https://promo.example.com
预期的行为:
如果我inputhttps://promo.example.com
,它应该redirect到https://example.com/xyz/xyz/promo
我不能把https://promo.example.com
,然后redirect到服务器块,因为nginx抛出一个错误。
如何将https://promo.example.com
redirect到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重定向到预期的网址,您需要为该网站设置单独的端口或单独的IP。
根据http://nginx.org/r/listen,listen指令的默认值是listen *:80 | *:8000;
listen *:80 | *:8000;
。
如果指令不存在,那么如果nginx以超级用户权限运行,则使用*:80;否则使用*:8000。
因此,您提供的代码片段根本不会影响https连接,因为它们不适用于ssl上的端口443。
您还没有提供您的ssl配置片段,也没有提供证书详细信息,因为我们无法为您提供完整的答案,但一旦理解了上述内容,答案就可能有用。
PS通常情况下,HTTPS本身并没有很好地与子域进行规划,除非您已经额外付费,否则您的证书可能不包括任何子域名,这意味着如果您或您的用户尝试了它,将导致浏览器警告通过https://
地址方案访问这些网站。
有两种方法可以解决这个问题:
为* .example.com提供通配符证书,以便所有子域可以共享相同的证书。
在不同的IP地址运行每个SSL站点。 这样,Web服务器就知道它可以发送给浏览器的SSL证书。 – 通过检查收到传入连接的IP地址。