我有一個運行 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
提前感謝您的幫助。如果您需要更多信息,請與我們聯繫。
答案1
您可能在網頁瀏覽器中以這種速記形式輸入這些 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位址。