最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

nginx server_name配置多個域名時的坑

 更新時間:2025年05月28日 09:20:12   作者:zzhongcy  
Nginx配置多個server_name時,$server_name默認(rèn)取第一個值,導(dǎo)致PHP獲取錯誤,下面就來介紹一下該問題的解決,感興趣的可以了解一下

server_name 指令詳解

server_name 指令設(shè)置基于域名的虛擬主機(jī),?個ip的服務(wù)器可以配置多個域名。下?這些server_name是有效的:

  • server_name domain.com;
  • server_name domain.com www.domain.com;
  • server_name *.domain.com;
  • server_name .domain.com;
  • server_name domain.*;
  • server_name "";

多個域名之間以空格分隔。nginx允許?個虛擬主機(jī)有?個或多個名字,也可以使?通配符"*"來設(shè)置虛擬主機(jī)的名字。

server_name指令在接到請求后的匹配順序分別為:

  • 1、準(zhǔn)確的server_name匹配,例如:domain.com www.domain.com
  • 2、以通配符開始的字符串: .domain.com  .domain.com
  • 3、以通配符結(jié)束的字符串:www.
  • 4、匹配正則表達(dá)式:~^(?.+).domain.com$

nginx將按照1,2,3,4的順序?qū)erver name進(jìn)?匹配,有?項匹配以后就會停?搜索,類似于location指令。

背景

為了區(qū)分線上環(huán)境和測試環(huán)境,我弄了個自己測試專用的域名test.daemoncoder.com,線上環(huán)境的正式域名是www.daemoncoder.com。nginx里的server_name配置改為:

# 只列出了我們關(guān)心的配置,省略了其他無關(guān)部分
server {
    server_name www.daemoncoder.com test.daemoncoder.com;
    ...
}

但是使用時發(fā)現(xiàn)請求一直報錯,重定向到錯誤頁面,于是開始了問題的定位。

問題的定位

根據(jù)業(yè)務(wù)上報錯時打的日志,定位到請求公共處理的部分里有這么一個判斷:

if ($_SERVER['SERVER_NAME'] != parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)) {
    $this->redirectError();
}

判斷請求referer里解析出的域名如果和nginx里的$server_name變量里的域名如果不一樣,就跳到錯誤頁面,也是前面說的問題。

那么問題來了,看referer中的域名為什么和 $_SERVER['SERVER_NAME'] 不一致呢?我請求用的鏈接形式如 http://test.daemoncoder.com/xxx 這種形式,但是最終在PHP這一層取到 $_SERVER['SERVER_NAME'] 的值為 www.daemoncoder.com,而 HTTP_REFERER 里的域名為:test.daemoncoder.com。

可以看到 SERVER_NAME 的取值和我們的預(yù)期不一致,nginx是怎么把這個變量傳過來的,需要從 nginx 的 fastcgi_params 配置文件中找一下 SERVER_NAME 的定義:

fastcgi_param SERVER_NAME $server_name;

可以看到 nginx 里的 $server_name 變量就是我們PHP里取的$_SERVER['SERVER_NAME'] 的來源。

問題的原因

通過上面的定位,我們基本可以看到問題的根本原因了(敲黑板,劃重點):

當(dāng)nginx配置里一個server節(jié)點下,server_name配置多個域名時,$server_name變量的值都是配置的第一個。

再回顧下我的 nginx 配置:

# 只列出了我們關(guān)心的配置,省略了其他無關(guān)部分
server {
    server_name www.daemoncoder.com test.daemoncoder.com;
    ...
}

server_name 結(jié)點有兩個:www.daemoncoder.com 和 test.daemoncoder.com,當(dāng)我用測試域名去訪問頁面的時候,可以匹配到 test.daemoncoder.com 這個域名,所以會根據(jù)當(dāng)前這個server節(jié)點的配置來處理這個請求,但是 nginx 會把 $server_name 的值設(shè)置為當(dāng)前 server 節(jié)點的配置的第一個 server_name,也就是 www.daemoncoder.com。如果配置改為:

server_name test.daemoncoder.com www.daemoncoder.com;

那么用測試域名請求就可以得到期望的值了(但是正式域名就出問題了)。

解決方式

第一種方式就是把配置文件按域名拆分到各自單獨的server節(jié)點下,也就是:

# 省略其他無關(guān)部分
server {
    server_name www.daemoncoder.com;
    ...
}
server {
    server_name test.daemoncoder.com;
    ...
}

這樣用不同的域名訪問會落到各自對應(yīng)的配置中,解析到的 $server_name 也都是各自的值。

第二種方式是修改 nginx SERVER_NAME 使用 $host 變量, 也就是把 

fastcgi_param SERVER_NAME $server_name;

修改為:

fastcgi_param SERVER_NAME $host;

$host變量的解析都是當(dāng)前請求的host,不會受 server_name 是否配置多個域名的影響,這樣我們在PHP里取 $_SERVER['SERVER_NAME'] 取出的值就是實際請求的域名,也可以解決問題(但是代碼里的這個判斷邏輯在測試環(huán)境似乎就沒有意義了,問題不大)。

其他

有多個域名時(server_name other.domain.com www. domain.com;):fastcgi_param SERVER_NAME $server_name ,$server_name 會取值第一個域名(other.domain.com)。

$host 有可能等于 $server_name ,也可能是IP地址(直接通過訪問此優(yōu)先順序取值:請求行中的主機(jī)名,或“主機(jī)”請求標(biāo)頭字段中的主機(jī)名,或與請求匹配的服務(wù)器名。

$1|$2|$3 ...是nginx在匹配正則時生成的變量,用于捕獲一個正則表達(dá)式括號中匹配的字符串(從左到右依次存儲在$1|$2|$3 ...中),新值覆蓋舊值,可以使用變量保存需要用到的值set $pre $1

到此這篇關(guān)于nginx server_name配置多個域名時的坑的文章就介紹到這了,更多相關(guān)nginx server_name配置多個域名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • LNMP 解決Access Denied錯誤詳細(xì)介紹

    LNMP 解決Access Denied錯誤詳細(xì)介紹

    這篇文章主要介紹了LNMP 解決Access Denied錯誤詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Nginx?HttpHeader增加幾個關(guān)鍵的安全選項問題小結(jié)

    Nginx?HttpHeader增加幾個關(guān)鍵的安全選項問題小結(jié)

    本文給大家介紹Nginx?HttpHeader增加幾個關(guān)鍵的安全選項問題小結(jié),結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-12-12
  • nginx 防盜鏈防爬蟲配置詳解

    nginx 防盜鏈防爬蟲配置詳解

    這篇文章主要介紹了nginx 防盜鏈防爬蟲配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Nginx搭配cpolar實現(xiàn)遠(yuǎn)程開發(fā)無縫協(xié)作全過程

    Nginx搭配cpolar實現(xiàn)遠(yuǎn)程開發(fā)無縫協(xié)作全過程

    Nginx是一款高性能的本地Web服務(wù)器,以其卓越的穩(wěn)定性和靈活的配置能力,成為開發(fā)者搭建本地服務(wù)的首選工具,本文將介紹如何利用 Ubuntu操作系統(tǒng)、Docker容器技術(shù)以及cpolar內(nèi)網(wǎng)穿透工具來實現(xiàn)公網(wǎng)遠(yuǎn)程訪問本地Nginx服務(wù)器的具體操作流程,需要的朋友可以參考下
    2026-01-01
  • Nginx配置及熱升級的詳細(xì)介紹

    Nginx配置及熱升級的詳細(xì)介紹

    Nginx與Apache一樣,都是web服務(wù)器,但是Nginx比Apache多一些功能,比如Nginx可以做代理,可以做負(fù)載均衡,這篇文章主要介紹了Nginx配置以及熱升級,需要的朋友可以參考下
    2024-07-07
  • Centos離線安裝Nginx全過程

    Centos離線安裝Nginx全過程

    文章講述了如何在CentOS系統(tǒng)上離線安裝Nginx環(huán)境,包括準(zhǔn)備必要的依賴庫(如C++環(huán)境、openssl、pcre、zlib),編譯Nginx源碼,以及啟動Nginx并驗證安裝是否成功
    2025-11-11
  • nginx搭建圖片服務(wù)器的過程詳解(root和alias的區(qū)別)

    nginx搭建圖片服務(wù)器的過程詳解(root和alias的區(qū)別)

    這篇文章主要介紹了nginx搭建圖片服務(wù)器(root和alias的區(qū)別)的過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Nginx中l(wèi)ocation實現(xiàn)多條件匹配的方法詳解

    Nginx中l(wèi)ocation實現(xiàn)多條件匹配的方法詳解

    在 Nginx 中,location 指令用于匹配請求的 URI,雖然 location 本身是基于單一匹配規(guī)則的,但可以通過多種方式實現(xiàn)多個條件的匹配邏輯,下面小編就來為大家介紹一下具體實現(xiàn)方法吧
    2025-03-03
  • 國內(nèi)一些常用PHP的CMS的Nginx服務(wù)器的偽靜態(tài)規(guī)則整理

    國內(nèi)一些常用PHP的CMS的Nginx服務(wù)器的偽靜態(tài)規(guī)則整理

    當(dāng)我們從apache服務(wù)器轉(zhuǎn)向Nginx服務(wù)器的時候,它們的偽靜態(tài)規(guī)則就不一樣了,所以你熟悉Nginx服務(wù)器的偽靜態(tài)規(guī)則,自己寫當(dāng)然也好
    2011-03-03
  • nginx后端節(jié)點的健康檢查和nginx平滑升級方式

    nginx后端節(jié)點的健康檢查和nginx平滑升級方式

    本文介紹了Nginx反向代理的ngx_http_proxy_module和ngx_http_upstream_module模塊,以及淘寶開發(fā)的nginx_upstream_check_module模塊,并介紹了Nginx平滑升級原理及實戰(zhàn)操作,最后總結(jié)了Nginx版本升級的方法
    2026-04-04

最新評論

江达县| 东至县| 平利县| 临泉县| 镇平县| 甘肃省| 潍坊市| 嘉善县| 庄浪县| 三穗县| 确山县| 图片| 威远县| 辽阳市| 尼木县| 连城县| 莫力| 灌云县| 南充市| 星子县| 枞阳县| 石渠县| 邵阳市| 乌拉特中旗| 离岛区| 乐业县| 佛山市| 武夷山市| 玉溪市| 尼玛县| 宿州市| 蓝田县| 于田县| 宜兰县| 岳池县| 大庆市| 黑水县| 嘉兴市| 邢台县| 武义县| 靖宇县|