現(xiàn)在有兩個靜態(tài)前端靜態(tài)項目: projectA, projectB, 需要配置成如:
www.test.com 指向A項目, www.test.com/b 指向B項目
- 先說正確結果, nginx 配置如下:
server {
listen 80;
server_name www.test.com;
location / {
root /data/projectA;
try_files $uri $uri/ /index.html;
}
location /b {
root /data/projectB;
## 注意這里面的 /projectB/index.html, vue里面,如果不寫這個的話, 會有問題, 如直接訪問: www.test.com/b/packing/index , 會去訪問/data/projectA/index.html文件 , 不符合我的效果, 所以這里讓它尋找一下: /projectB/index.html 就可以了
try_files $uri $uri/ /projectB/index.html;
}
access_log /data/logs/nginx/www.test.com.access.log main;
error_log /data/logs/nginx/www.test.com.error.log;
}
- 再說一下坑
剛開始配置的時候,訪問: www.test.com/b/js/test.js nginx會報404錯, 看到nginx錯誤,
[error] 27786#27786: *1487762 open() "/etc/nginx/html/js/test.js" failed (2: No such file or directory)
根本不是我配置的root路徑, 就很奇怪, 大概配置如下:
server {
listen 80;
server_name www.test.com;
location / {
root /data/projectA;
try_files $uri $uri/ /index.html;
}
location /b {
root /data/projectB;
try_files $uri $uri/ /projectB/index.html;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
access_log off;
}
location ~ .*\.(js|css)$ {
expires 12h;
access_log off;
}
access_log /data/logs/nginx/www.test.com.access.log main;
error_log /data/logs/nginx/www.test.com.error.log;
}
- 發(fā)現(xiàn)問題:
后來發(fā)現(xiàn) , 在上面有做 js緩存 ,有這個代碼
location ~ .*\.(js|css)$ {
expires 12h;
access_log off;
}
這是區(qū)分大小寫的正則匹配, nginx中, 如果匹配到了這個location 就不會去找別的配置的location了, 最后把這個去掉就正常了, 這個問題找了好久 = =
- 關于匹配的規(guī)則文檔
nginx的優(yōu)先匹配規(guī)則
模式 含義
location = /uri = 表示精確匹配,只有完全匹配上才能生效
location ^~ /uri ^~ 開頭對URL路徑進行前綴匹配,并且在正則之前。
location ~ pattern 開頭表示區(qū)分大小寫的正則匹配
location ~* pattern 開頭表示不區(qū)分大小寫的正則匹配
location /uri 不帶任何修飾符,也表示前綴匹配,但是在正則匹配之后
location / 通用匹配,任何未匹配到其它location的請求都會匹配到,相當于switch中的default
順序不等于優(yōu)先級:
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/),
tip : location 配置與書寫順序無關, 看他的優(yōu)先級, 然后看最大匹配