【问题标题】:Not able to redirect https site to another url - nginx server block无法将 https 站点重定向到另一个 url - nginx 服务器块
【发布时间】:2015-08-07 12:22:46
【问题描述】:

我正在尝试将促销子域附加到我已经在 https 上的网站,然后使用重定向 url 重定向到网站中的另一个页面。例如,基本上如果我的网站是https://example.com 并且有一个页面https://example.com/xyz/xyz/promo,那么当我输入https://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时,它会正确重定向。但如果我输入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

【问题讨论】:

  • 我相信 https 使用 443 端口,所以你应该为此列出端口 443
  • 尝试添加这个:listen 443 default_server ssl;
  • 其实我已经在我的服务器声明块里听了443 ssl spdy,他们基本上不做同样的事情吗?
  • 我在上面的配置中没有看到它,所以我才这么说,serverfault.com/questions/10854/…,我认为 spdy 不应该在那里
  • 如果您转到该页面 promo.example.comhttp://(端口 80)会自动添加到前面。您只需将 listen 80 添加到最新的服务器块。

标签: php redirect nginx


【解决方案1】:

由于使用 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;
}

【讨论】:

    【解决方案2】:

    试试这个:

    server {
    server_name promo.example.com;
    rewrite ^ https://example.com/xyz/xyz/promo permanent;
    

    【讨论】:

    • 和以前一样的问题
    【解决方案3】:

    每个服务器都可以有一个 https 实例,在这种情况下是 example.com,因此当 https 前缀到任何 url 时,无论 url 是什么,用户都会被重定向到 example.com。

    要使用 https 将用户重定向到预期的 url,您需要为该站点提供单独的端口或单独的 IP。

    【讨论】:

      【解决方案4】:

      根据http://nginx.org/r/listen,listen 指令的默认值为listen *:80 | *:8000;

      如果该指令不存在,则如果 nginx 以超级用户权限运行,则使用 *:80,否则使用 *:8000。

      因此,您提供的 sn-ps 对 https 连接完全没有影响,因为它们不适用于通过 ssl 的端口 443。

      您没有提供您的 ssl 配置 sn-ps,也没有提供证书详细信息,以便我们为您提供完整的答案,但一旦了解上述内容,答案可能会自行发挥作用。

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

      附:一般来说,HTTPS 本身并不能很好地规划子域,除非您支付了额外费用,否则您的证书可能不会涵盖任何子域,这意味着如果您或您的用户尝试这样做,它将导致浏览器警告通过https:// 地址方案访问此类网站。

      【讨论】:

      • 更新了问题,谢谢,我现在查看该链接,但如果我必须在子域上拥有 https,它是否应该在不同的 IP 上?
      • @Slartibartfast,不,如果您有不同的证书,它只需要是不同的 IP。如果您当前的证书不涵盖promo.example.com(明确地,或通过*.example.com),并且您决定为此类子域购买另一个单独的证书,那么,是的,建议为此类额外的额外IP证书,以确保与稍旧的客户端的整体兼容性。
      • 那没关系,我的证书涵盖 *.example.com ,但仍然无法让 https://... promo.example.com 重定向(它仍然在 example.com 但带有 url已更改)和 http://.... 正确重定向
      • 如果您需要更多帮助,请提供更多详细信息。但是,根据个人经验,某些浏览器会硬缓存301 重定向(为此我只使用302),因此,您可能会点击缓存副本(避免这种情况的最佳方法是使用curl 进行测试)。值得考虑的另一点——你为什么首先需要这个?域解析的额外延迟、短暂的 TLS 连接以及重定向本身,would only serve to decrease the likelihood that a purchase would be made
      • @Slartibartfast,想想你的 IP 地址问题,在你的 promo.example.com 块中简单地添加 listen 80; listen 443 ssl spdy; 不工作吗?如果没有其他方法起作用并且您感到绝望,也许只需将if ($host = "promo.example.com") {return 301 https://example.com/xyz/xyz/promo;} 之类的东西放在主要location /https server 中就可以了? (另外,不要忘记将server_name 也修改为promo.example.com。)
      【解决方案5】:

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

      • 拥有 *.example.com 的通配符证书,因此所有子域都可以共享同一个证书。

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

      【讨论】:

        猜你喜欢
        • 2014-01-20
        • 1970-01-01
        • 2016-04-05
        • 2020-10-17
        • 2019-02-23
        • 2014-05-04
        • 2016-04-20
        • 2012-05-27
        • 2017-12-21
        相关资源
        最近更新 更多