无法将https站点重定向到另一个url - nginx服务器阻塞


Not able to redirect https site to another url - nginx server block

我试图将一个促销子域附加到我的网站上,该网站已经在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证书。