【问题标题】:Nginx location block matching ruleNginx 位置块匹配规则
【发布时间】:2017-08-11 16:13:55
【问题描述】:

我是 nginx 服务器的新手。
我要把codeigniter等php框架部署到nginx服务器上。
我的配置文件如下。

server {
    index index.html index.php index.htm;

    # set expiration of assets to MAX for caching
    location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {  
        expires max;
        log_not_found off;
    }

    location / {  
        # Check if a file exists, or route it to index.php.
        try_files $uri $uri/ /index.php;
    }

    location ~* \.php$ {  
        fastcgi_pass unix:/var/run/php/php7-fpm.sock;
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
 }

我的问题如下。
1)请求uri是这样的“www.domain.com/controllername/functionname/param1/param2/”
nginx 如何处理这个 url?

2)第三个位置块匹配正则表达式“.php$”。
仅当 uri 以“.php”结尾时才如此吗?
(我是这么认为的,但是那个块的 fastcgi_split_path_info 有不同的正则表达式。)

【问题讨论】:

    标签: regex nginx configuration webserver


    【解决方案1】:

    问题 1) 是的,这应该可行,因为

    try_files $uri $uri/ /index.php;
    

    对一个请求一一处理。首先 nginx 尝试查找 URI 描述的文件,如果没有匹配,它会检查它是否是一个目录。如果不是,它会调用您的 index.php 文件。原始 URI 与许多其他 HTTP_REQUEST 变量一起移交,并且 codeigniter 的代码负责解析 url,如果您进行了配置(codeigniter 是正确的)。 codeigniter 的调用约定是“www.domain.com/controllername/public_function/param1/param2/” 所以通常你不会给出视图名,而是你的 URI 中的控制器和函数名。

    问题 2) "location" 指令仅使用 URI 路径,没有任何 GET 参数。 split_path 的工作方式不同,因此需要不同的正则表达式。

    【讨论】:

    • 在codeigniter处理uri之前,nginx会处理那个吗?我想是的。
    • 没错,但是您的配置工作方式这不是问题。
    • 谢谢,但是当 codeigniter 收到 uri 时,它是如何改变的?
    • 我的意思是 www.domain.com/controllername/public_function/param1/param2/ 怎么改成 index.php?query
    • 感谢您的帮助。对 nginx 来说没问题。
    猜你喜欢
    • 2018-10-24
    • 2021-09-05
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2011-07-11
    • 2016-05-30
    • 1970-01-01
    • 2014-11-11
    相关资源
    最近更新 更多