nginx☞fcgi中alias的使用

阅读量: zyh 2020-05-27 14:46:54
Categories: > Tags:

前言

众所周知, 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;
    }
}

官方的例子:

https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#use-request-filename-for-script-filename

关键点:

  1. 当你用 alias 而不是 root 的时候, 你需要将$document_root$fastcgi_script_name替换成$request_filename
  2. 当你不在使用$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相对路径