Apache 從 Nginx “劫持”一個 URL
我有一個執行 Apache 的 Ubuntu 伺服器,它託管一個 Wordpress 站點,可以使用 HTTP 訪問該站點。還安裝了 Nginx,它託管一個只能使用 HTTPS 訪問的 Django 站點。
現在,我想要完成的是,
example.com
將www.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 地址。