NGINXで古いサイトURLを新しいサイトURLにリダイレクトする問題


0

私はアトラシアンスタックのベースURLを変更しようとしましたが、わずかな成功しかありませんでした。Nginxリバースプロキシを備えたUbuntuサーバー16.04LTS。内部IPと外部IPは異なるNICに割り当てられます。はい、この同じ質問がstackoverflowに投稿されていますが、私はこの1つで最大限の露出を得ようと考えました。

サンプルの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.comからhttps://projects.new-site.comへのリダイレクト。

さらに奇妙なことに、リダイレクトをテストするためにhttps://projects.old-site.comにアクセスしようとすると、ブラウザは.old-site.comをまだ提供されているだけでなく、そのドメインの期限切れのSSL証明書を提供されています。

私のシステムのどこにも、このサーバーでアクセス可能な期限切れの証明書はありません。Atlassian URL更新ガイドに従って、server.xmlファイルのみを変更し、アプリケーション管理画面内から(アクセス可能な場合)変更しました。すべてのDNSサーバーが正しいIPを指している。私は間違いなく何かを見逃していますが、途方に暮れています。これは、Nginxと同じバージョンのAtlassianソフトウェアがインストールされた2つの異なるUbuntu 16.04サーバーで繰り返されています。

助けてください。


projects.old-site.comとold-site.comは独自の個別のサーバーエンティティであり、個別のアイテムとして処理する必要があります。old-site.comは、nginxの別のサーバー設定ディレクティブによって処理される場合や、まったく異なるサーバーを指す場合もあることを考慮してください。また、SSLを提供する各サーバーブロックにssl_certificateおよびssl_certificate_keyディレクティブが必要であるか、SSL証明書の問題が発生することを考慮してください。(ちなみに、設定にはさまざまな問題があります...)
トーマスウォード

正確さのために更新されました。問題を説明してください、それが私がここにいる理由です:)
jrea

回答:


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サイトにリダイレクトするだけで、明らかな理由(同じリクエストURIを渡さないため、適切に機能しません)含め$request_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

3つ目のブロックになります。 *サーバーブロック全体とそのすべての構成ディレクティブがなければ、ブロックの構成を適切に支援できません。

あなたは私たちにこれを与えました:

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バックエンドアプリケーションのためのディレクティブを、あなたはおそらくそれを削除する必要があります。


詳細な対応ありがとうございました。私はこのサーバーでしばらく作業しており、ここで作業を開始したときに引き継ぎました。はい、バックエンドアプリケーションにはclient_max_body_sizeディレクティブが必要なので、そのままにしておく必要があります。これをテストし、結果を報告します。
jrea

実際、古いサイトのssl_certificateおよびssl_certificate_keyディレクティブがありませんでした。面白いことに、NginxのWebサイトでは、私がそこでこの問題を調査していたときに言及していません。どうもありがとう。
jrea

@jreaこれが問題の解決に役立ってうれしいです!暗黙の経験則は、「SSLを提供するすべてのサイトには、独自のSSL証明書ディレクティブを定義する必要がある」ということです。これにより、適切な証明書が提供されます。
トーマス・ウォード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.