Apache が Nginx から URL を「ハイジャック」する

Apache が Nginx から URL を「ハイジャック」する

私は Apache を実行している Ubuntu サーバーを所有しており、このサーバーは HTTP 経由でアクセスできる Wordpress サイトをホストしています。また、HTTPS 経由でのみアクセスできる Django サイトをホストする Nginx もインストールされています。

ここで実現したいのは、 とexample.comwww.example.comApache でホストされている Wordpress に移動し、 がapi.example.comNginx でホストされている Django に移動することです。 のメイン ページにアクセスしようとすると、現時点では機能しますapi.example.comが、奇妙な問題が 1 つあります。 (Django 管理パネル) にアクセスしようとするとapi.example.com/admin、ページが の Wordpress 管理ログイン ページにリダイレクトされますwww.example.com/wp-admin。なぜでしょうか。

Django 管理パネルの URL を別のものに変更しようとしたこともありました。その結果、Wordpress 404 ページ (「おっと、そのページは見つかりませんでした!」) が表示されました。

つまり、ドメインの後の URL の部分は、別のサブドメインにあるにもかかわらず、Apache によってハイジャックされているようです。この原因は何ですか、また、どうすれば修正できますか?

Apache サイトは次のように構成されています。

<VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /var/www/wp

    <Directory /var/www/wp>
        Options Indexes FollowSymlinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>

Nginx サイトは次のように構成されています。

upstream app_server {
    server unix:/tmp/gunicorn.sock fail_timeout=0;
}

server {
    listen 443 ssl;
    charset utf-8;
    server_name api.example.com;

    ssl on;
    # Here be a lot of SSL configs

    location / {
        try_files $uri @proxy_to_app;
    }

    location @proxy_to_app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://app_server;
    }

    location /static {
        root /var/www/django/static;
    }
}

最終的に、DNS レコードは次のように設定されます。

A example.com 1.2.3.4
CNAME api example.com
CNAME www example.com

ご協力ありがとうございます。さらに情報が必要な場合はお知らせください。

答え1

おそらく、これらの URL を Web ブラウザのこの短縮形式で入力しており、ブラウザはあなたが何を望んでいるのかを正しく推測していません。おそらく、履歴から「api.example.com」と入力すると HTTPS を使用する必要があることを記憶していますが、新しい URL「api.example.com/whatever」の場合は履歴がないため、最初に HTTP を試します。

これらすべてに同じIPアドレスを使用している場合、https://api.example.com/* HTTPSポート(443)をリッスンしているプロセスに送られます。http://api.example.com/* 引き続き、HTTP ポート (80) をリッスンしているプロセスに送信されます。

同じ IP アドレスを維持しながらこれを回避したい場合は、受信したすべてのリクエストを HTTPS にリダイレクトする api.example.com 仮想ホストを HTTP 専用サーバー内に設定します。

実際に難しい方法で分割するには、api.example.com の新しい IP アドレスをサーバーに追加し、2 つの HTTP(S) サーバーがそれぞれ独自の IP でリッスンするようにし、api.example.com が新しい IP アドレスを指すように DNS を更新します。

関連情報