先貼出我的server設定:
server {
listen 80;
server_name xxx;
# 1
location = /favicon.ico {
root /home/www-data/static;
rewrite (.*) /img/designs/admin-favicon.ico;
}
#2
location = /robots.txt {
root /home/www-data/static;
rewrite (.*) /admin-robots.txt;
}
# 3
location / {
proxy_pass_header Server;
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://127.0.0.1:22222;
}
}
官方給出的location搜尋路徑優先權和演算法描述如下:
To find location matching a given request, nginx first checks
locations defined using the prefix strings (prefix locations). Among
them, the location with the longest matching prefix is selected and
remembered. Then regular expressions are checked, in the order of
their appearance in the configuration file. The search of regular
expressions terminates on the first match, and the corresponding
configuration is used. If no match with a regular expression is found
then the configuration of the prefix location remembered earlier is
used.
依照我的理解,Nginx搜尋的時候演算法應該是這樣的:
- 按照請求前綴搜尋location最長普通前綴匹配(如果有=修飾符,則直接匹配該location,如果有^~修飾符,則直接使用該location),記住最長匹配location。
- 繼續按照配置順序搜尋正規匹配,如果有,則直接匹配第一個匹配到的location,否則使用普通最長location
也就說,按照我的配置,瀏覽器請求/favicon.ico的時候,應該是直接精準匹配到
1 才對啊,可是每次都配對到 3。
這裡請教各位,我對Nginx location的理解有沒有偏差?然後為什麼我的配置會是這樣的結果?
按照樓主的方法配置了一下,我這裡是可以進到# 1的。
我覺得可能是CDN快取的問題。樓主試試別的檔案rewrite或是在沒有CDN的環境下試試。