前言
众所周知, nginx 在配置静态资源的时候, root 和 alias 分别是两种指定资源路径的方式.
如果:
url 是 http://xxx.com/god/a.jpg
,且 location 匹配的是 /god/
.
则:
当用 root 定位资源路径时, root 配置的值=域名xxx.com
部分所对应的路径, 此时 a.jpg 的物理路径就是 $root/god/a.jpg
当用 alias 定位资源路径时, alias 配置的值=urlxxx.com/god/
部分所对应的路径, 此时 a.jpg 的物理路径就是 ${alias}a.jpg
即
location ^~ /god/ {
root /export/webapps/xxx.com;
}
# 或者
location ^~ /god/ {
alias /export/webapps/xxx.com/god/;
}
当我采用上述规则, 使用alias配置fcgi的时候,现实给了我暴击…妥妥的404了.
在fcgi环境下, alias 的配置
废话不多说, 直接上结果.
location ^~ /god/ {
index index.php index.html index.htm;
root /export/webapps/xxx.com/;
location ~* "\.php$" {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
location ^~ /god/ {
index index.php index.html index.htm;
alias /export/webapps/xxx.com/god/;
location ~* "\.php$" {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
include fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
}
官方的例子:
关键点:
- 当你用 alias 而不是 root 的时候, 你需要将$document_root$fastcgi_script_name替换成$request_filename
- 当你不在使用$fastcgi_script_name的时候,你需要显性的添加index,而不是fastcgi_index ,因为$request_filename并不能关联fastcgi_index。
原因在于$document_root的值,来自于root或者alias,$fastcgi_script_name总是拿url_path
假设你访问 /god/api.php, 而这个文件的物理路径是/export/webapps/xxx.com/god/api.php。
此时,
当你用 alias 的时候
$document_root = alias = /export/webapps/xxx.com/god/
$fastcgi_script_name = /god/api.php
$document_root$fastcgi_script_name=/export/webapps/xxx.com/god//god/api.php
而$request_filename当前文件的请求路径,由root或者alias+uri相对路径