laravel 在配置nginx代理時遇到的連結問題

echo_dump 發表於 2020-11-27

nginx 反向代理相關問題

  • 需求:

關於一個多語言站點的部署,只有中文站點在國內,多於站點部署在國外,國外是主營業務,所以國外算是主站點,域名類似comunity.xx.com,英語和小語
種都是通過sg|au|fr|de|ru|jp|it訪問,國內通過cn訪問,國內的在國內伺服器,通過nginx代理訪問國內。

  • 環境
語言 伺服器 資料庫 前臺框架 後臺框架 伺服器化境
php7.2 nginx mysql5.7 laravel5.8 laravel-admin CentOS7
  • 大致的訪問流程, nginx1https,nginx2http

laravel 在配置nginx代理時遇到的連結問題

comunity.xx.com/de|ru|jp| 訪問主伺服器 nginx1 處理返回結果

comunity.xx.com/cn 訪問主伺服器 nginx1,伺服器nginx1做一次代理轉發到國內伺服器nginx2,處理返回結果

  • nginx1 配置
server {
 listen       80; server_name  php.xxx.com; root   html; index  index.html index.htm;
 }
server {
 listen       443; server_name  php.xxx.com; root   html; index  index.html index.htm; location ~ \.php$ { fastcgi_pass   127.0.0.1:9000; fastcgi_index  index.php; fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name; include        fastcgi_params; }     location /cn {
 proxy_pass  http://192.168.1.100:6060; proxy_set_header Host $server_name; proxy_set_header X-Real-IP $remote_addr;#把源IP 【$remote_addr,建立HTTP連線header裡面的資訊】賦值給X-Real-IP
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#在nginx 作為代理伺服器時,設定的IP列表,會把經過的機器ip,代理機器ip都記錄下來
 }}
  • nginx2 配置
server {
 listen       6060; server_name  localhost; root   html; index  index.html index.htm; location ~ \.php$ { fastcgi_pass   127.0.0.1:9000; fastcgi_index  index.php; fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name; include        fastcgi_params; }     location /cn {
 proxy_pass  http://192.168.1.100:6060; proxy_set_header Host $server_name; proxy_set_header X-Real-IP $remote_addr;#把源IP 【$remote_addr,建立HTTP連線header裡面的資訊】賦值給X-Real-IP
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#在nginx 作為代理伺服器時,設定的IP列表,會把經過的機器ip,代理機器ip都記錄下來
 }}
  • 遇到問題

1. 在本地部署一臺服務,然後在虛擬機器部署一臺服務,模擬線上環境,在切換到cn站點的時候,可以正確使用laravel route()函式得到正確的url連結,
但是在正式環境,使用route()函式得到的連結是php.xxx.com/abc少了cn。我想要得到的是php.xxx.com/cn/abc
使用reauest()->url()得到的當前連結,在cn站點也是會少了cn。路由寫的都是正確的,輸入路由都可以得到正確的網頁,所以不會是路由寫錯了的問
題。後來通過設定app('url')->forceScheme('https');app('url')->forceRootUrl('https://php.xxx.com/cn');可以生成我想要的鏈
接了,但是reauest()->url()這個函式目前依然生成的連結缺少cn,目前我已經儘量復原線上的環境了,本地測試沒有問題,但是到線上還是有點問題。
雖然使用別的方式解決了生成當前連結的問題,但是使用reauest()->url()這個函式依然會有問題,除非我不使用laravel中的生成連結的函式,但是專案
中使用route()函式的地方太多了。

2. 再說後臺的問題,laravel-admin的後臺,開啟了配置檔案admin.php中的https'secure' => env('ADMIN_HTTPS', false), 訪問連結也是
問題不斷,使用URL::current()函式拿取當前連結,連結拿取不到,拿到的連結只有協議,沒有域名。載入的靜態資源還是載入的主伺服器的靜態資源,把
靜態資源加上cn會顯示404的狀態碼。


目前的思路就是從兩方面,一個是nginx的代理方面,一個是框架程式碼方面。暫未解決

本作品採用《CC 協議》,轉載必須註明作者和本文連結
LIYi ---- github地址