Domain-Name-System

Apache 從 Nginx “劫持”一個 URL

  • June 15, 2015

我有一個執行 Apache 的 Ubuntu 伺服器,它託管一個 Wordpress 站點,可以使用 HTTP 訪問該站點。還安裝了 Nginx,它託管一個只能使用 HTTPS 訪問的 Django 站點。

現在,我想要完成的是,example.comwww.example.com轉到由 Apache 託管的 Wordpress,同時api.example.com轉到由 Nginx 託管的 Django。如果我只是嘗試訪問 的首頁,目前這確實有效api.example.com,但有一個奇怪的問題:當我嘗試訪問api.example.com/admin(Django 管理面板)時,頁面被重定向到 的 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

提前感謝您的幫助。如果您需要更多資訊,請與我們聯繫。

您可能在 Web 瀏覽器中以這種速記形式輸入這些 URL,但它並沒有正確猜測您想要什麼;它可能從歷史記錄中記得,當您鍵入“api.example.com”時,它應該使用 HTTPS,但對於新 URL“api.example.com/whatever”,它沒有歷史記錄,因此它首先嘗試 HTTP。

如果您對所有這些都使用相同的 IP 地址,則不管https://api.example.com/ * 將進入偵聽 HTTPS 埠 (443) http://api 的程序。 example.com/ * 仍將轉到偵聽 HTTP 埠 (80) 的程序。

如果您想在保持相同 IP 地址的同時避免這種情況,請在僅 HTTP 的伺服器中設置一個 api.example.com 虛擬主機,將它收到的每個請求重定向到 HTTPS。

要實際拆分它們,請將 api.example.com 的新 IP 地址添加到伺服器,並讓兩個 HTTP(S) 伺服器在各自的 IP 上偵聽,並更新 DNS 以便 api.example.com 指向新的 IP 地址。

引用自:https://serverfault.com/questions/699132