无法将https站点redirect到另一个url – nginx服务器块

我正在试图附加一个促销子域名到我的网站已经在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.comredirect到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配置片段,也没有提供证书详细信息,因为我们无法为您提供完整的答案,但一旦理解了上述内容,答案就可能有用。

您可以参考http://nginx.org/en/docs/http/configuring_https_servers.html#single_http_https_server关于配置单个服务器来处理HTTP和HTTPS请求。

PS通常情况下,HTTPS本身并没有很好地与子域进行规划,除非您已经额外付费,否则您的证书可能不包括任何子域名,这意味着如果您或您的用户尝试了它,将导致浏览器警告通过https://地址方案访问这些网站。

有两种方法可以解决这个问题:

  • 为* .example.com提供通配符证书,以便所有子域可以共享相同的证书。

  • 在不同的IP地址运行每个SSL站点。 这样,Web服务器就知道它可以发送给浏览器的SSL证书。 – 通过检查收到传入连接的IP地址。