使用 NGINX 将旧网站 URL 重定向到新网站 URL 时出现问题

使用 NGINX 将旧网站 URL 重定向到新网站 URL 时出现问题

我一直试图更改 Atlassian 堆栈中的基本 URL,但收效甚微。Ubuntu 服务器 16.04LTS 带有 Nginx 反向代理。内部和外部 IP 分配给不同的 NIC。是的,这个问题也发布在 stackoverflow 上,但我想我会尝试最大限度地提高这个问题的曝光率。

示例 Nginx 服务器文件:

server {
  listen                80;
  listen                443 ssl;
  server_name           projects.old-site.com;
  access_log            off;
  return 301 $scheme://projects.new-site.com;
}

server {
  listen                80;
  server_name           projects.new-site.com;
  access_log            off;

  client_max_body_size  100M;

  return 301 https://$host$request_uri;
}

server {
  listen                443 ssl;
  server_name           projects.new-site.com;

  client_max_body_size  100M;

  ssl_certificate       /path/to/new-site.crt;
  ssl_certificate_key   /path/to/new-site.key;

location /
...output omitted

有效的方法:HTTP 重定向和 HTTP 到 HTTPS 重定向。http://projects.old-site.com正确重定向至https://projects.new-site.com. 只需输入即可直接访问http://projects.new-site.com(也正确重定向到 HTTPS)。

不可以做的:https://projects.old-site.comhttps://projects.new-site.com重定向。

更奇怪的是,当尝试访问https://projects.old-site.com为了测试重定向,浏览器不仅仍可使用 .old-site.com,而且还可使用该域名的过期 SSL 证书。

在我的系统中,此服务器上的过期证书无处可访问。我遵循了 Atlassian URL 更新指南,仅更改了 server.xml 文件,并从应用程序管理屏幕(当它们可访问时)内进行更改。所有 DNS 服务器都指向正确的 IP。我肯定错过了什么,但我不知所措。这在安装了 Nginx 和相同版本的 Atlassian 软件的两台不同的 Ubuntu 16.04 服务器上重复出现。

请帮忙。

答案1

您的配置遇到了一些问题。

我们将在这里分别介绍每个单独的服务器块。


块 #1:projects.old-site.com -> projects.new-site.com 重定向

这是您向我们提供的信息:

server {
    listen                80;
    listen                443 ssl;
    server_name           projects.old-site.com;
    access_log            off;
    return 301 $scheme://projects.new-site.com;
}

你缺少了很多此处的配置内容:

  • ssl_certificate指令 - 需要知道为域名提供什么 SSL 证书。
  • ssl_certificate_key指令 - 与“旧”项目站点的 SSL 证书相对应的 SSL 证书密钥文件。

你正在进行 301 重定向以匹配该方案,但如果你在服务器块 2 中将非 SSL 定向到 SSL,为什么要这样做?只需重定向到 HTTPS 站点,包括的$request_uri原因很明显(您没有传递相同的请求 URI,所以事情无法正常工作)。

你的正确的此处的服务器块应更类似于此:

server {
    listen 80;
    listen 443 ssl;
    server_name projects.old-site.com;

    ssl_certificate /path/to/valid/projects.old-site.com/certificate;
    ssl_certificate_key /path/to/valid/projects.old-site.com/certificate.key;

    access_log off;
    return 301 https://projects.new-site.com$request_uri;
}

块 #2:projects.new-site.com 的 http -> https 重定向

您给了我们这个:

server {
    listen                80;
    server_name           projects.new-site.com;
    access_log            off;

    client_max_body_size  100M;

    return 301 https://$host$request_uri;
}

这里没有太多问题,但让我们尝试一下不是在这里全局接受$host(我们不需要它,我们知道我们希望它最终在哪里),我们也不需要client_max_body_size。 301 重定向无论如何都不会尊重这一点。

应该最终结果如下:

server {
    listen                80;
    server_name           projects.new-site.com;
    access_log            off;

    return 301 https://projects.new-site.com$request_uri;
}

第 3 部分:https://projects.new-site.com

现在进入第三个区块。 *如果没有整个服务器块及其所有配置指令,我们就无法正确协助配置该块。

您给了我们这个:

server {
    listen                443 ssl;
    server_name           projects.new-site.com;

    client_max_body_size  100M;

    ssl_certificate       /path/to/new-site.crt;
    ssl_certificate_key   /path/to/new-site.key;

    ...
}

这个区块没有什么问题,但是除非你需要您的后端应用程序的指令client_max_body_size,您可能应该将其删除。

相关内容