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

时间:2015-08-07 12:22:47

标签: php redirect nginx

我正在尝试将促销子域名附加到我的网站上,该网站已经在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

5 个答案:

答案 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地址。