nginx 可用配置文件

LNMP环境搭建好之后,还需要配置好nginx,遇到了一些坑,记录下留待以后使用

1.查阅了一些资料,合理后写了一份完整可用的nginx配置文件
server {
    listen       80;
    server_name  www.test.com;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        root   /usr/share/nginx/html/test;
        index  index.html index.htm index.php;
    #这个指令的作用就是可接收多个路径作为参数,当前一个路径的资源无法找到,则自动查找下一个路径
    try_files  $uri  /index.php$uri;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    # 设置上传文件目录
    location ^~  ./Upload/ {
        root   /usr/share/nginx/html/test/;
    }
    #   静态资料
    location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css|less)$ {   
                root      /usr/share/nginx/html/Docksboy/;  
                expires   7d; 
        }
    #重写个人主页
    location ^~  /User/ {
        root    /usr/share/nginx/html/test/;
        rewrite  ^/User/(.*)$  /index.php/User/index/u/$1  last;  
        break;
    }
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}
    
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    # 去掉$符号,匹配规则不要写成 location ~ \.php/.*$  不然匹配不到admin.php,但能匹配到admin.php/
    location ~ \.php { 
            root            /usr/share/nginx/html/test;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        include        fastcgi_params;
        
            fastcgi_split_path_info ^(.+?\.php)(.*)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param SCRIPT_NAME $fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
2.location的执行逻辑
“正则 location ”的匹配规则是“顺序匹配,且只要匹配到第一个就停止后面的匹配”;“普通location ”与“正则 location ”之间的匹配顺序是先匹配普通 location ,再“考虑”匹配正则 location 。注意这里的“考虑”是“可能”的意思,也就是说匹配完“普通 location ”后,有的时候需要继续匹配“正则 location ”,有的时候则不需要继续匹配“正则 location ”。两种情况下,不需要继续匹配正则 location :( 1 )当普通 location 前面指定了“ ^~ ”,特别告诉 Nginx 本条普通 location 一旦匹配上,则不需要继续正则匹配;( 2 )当普通location 恰好严格匹配上,不是最大前缀匹配,则不再继续匹配正则。

3.遇到的坑,添加PATH_INFO
(1)PHP中搜索cgi_fix_pathinfo,并将其值改为1(cgi_fix_pathinfo=1)
(2)匹配php时,去掉$符号,匹配规则不要写成 location ~ \.php/.*$ 不然匹配不到admin.php,输入地址后会一直提醒下载admin.php,但能匹配到admin.php/, 正确方式如上配置
(3)添加path_info,最关键的一步了,网上流传的方法基本上是这样的
location ~ \.php
{
     fastcgi_index index.php;
     fastcgi_pass 127.0.0.1:9000;
     include      fastcgi_params;
     set $path_info "";
     set $real_script_name $fastcgi_script_name;
     if ($fastcgi_script_name ~ "^(.+?\.php)(.*)$") {
     set $real_script_name $1;
     set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME /var/html/$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}
这个配置看似没有问题,但用php框架修改默认路由时,访问www.test.com却一直访问的是www.test.com/Index/index,这个问题让我纠结很久,经过排查发现了一些异常,打印$_SERVER,发现PATH_INFO和PHP_SELF的值有点问题
Array(
    [HTTP_HOST] => www.test.com
    [PATH_INFO] => /index.php
    [SCRIPT_FILENAME] => /usr/share/nginx/html/test/index.php
    [PHP_SELF] => /index.php/index.php
)
正常的情况下,这两个值应该是:
Array(
    [HTTP_HOST] => www.test.com
    [PATH_INFO] => /
    [SCRIPT_FILENAME] => /usr/share/nginx/html/test/index.php
    [PHP_SELF] => /index.php
)
出现这个问题是因为,这一步匹配有问题(匹配的正则是正确的),正则匹配的第二项在匹配www.test.com时,不应该有值的,但却匹配出了一个index.php,事实就是这么怪
$fastcgi_script_name ~ "^(.+?\.php)(.*)$"
下面介绍正确的匹配方法
fastcgi_split_path_info ^(.+?\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
看来网上介绍的方法,还需要自己多多的验证一下,只有经过自己思考后,才能更好的利用它。
  • 发布时间:2019-04-05