Nginx Location 指令 - 文件被下载

Nginx Location 指令 - 文件被下载

我目前已设置了一个 Nginx 位置块,当且仅当它以 开头和结尾时,它才与 uri 匹配/auth/test.php。唯一匹配的是http://host/auth/test.php

location  ~ ^/auth/test\.php$ {

        # Use try files or the if statement below. try_files is preferred
        # If the original URI ($uri) does not resolve into an existing file or directory, a 404 error is returned
        try_files $uri =404;

        fastcgi_split_path_info ^(.+\.php)(/.+)$; #

        fastcgi_param USERNAME $arg_username;
        fastcgi_param PASSWORD $arg_password;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include fastcgi_params;
}

我的理解是,当 Nginx 尝试匹配位置块时,查询参数不起作用。test.php当 uri 的形式为 时,我的脚本 会被处理http://host/auth/test.php?username=blah&password=blah。但是,如果我尝试使用没有查询参数的 uri ( http://host/auth/test.php),则脚本test.php会被请求它的人下载,这并不理想。有没有办法让 Nginx 不处理这种类型的 uri 请求?我以为该try_files指令会处理这种情况,但显然不是。谢谢。

答案1

首先,您的正则表达式是 URI 字符串的精确匹配。因此,请改用 NGINX 的精确(非常规)匹配。这还将确保最高优先级:

location = /auth/test.php {

接下来,您似乎不需要/auth/test.php/foo转发到不同 PHP 文件的类型 URL。因此,请完全删除fastcgi_split_path_info

实际的/auth/test.php脚本是处理请求的脚本。因此,只需将其名称放入 fastcgi 指令中:

fastcgi_param SCRIPT_FILENAME $document_root/auth/test.php;

最后,这try_files $uri =404;无关紧要,可能会引起更多麻烦。您已经知道文件在那里,不需要额外的stat系统调用来检查它是否存在。

因此完整的代码片段可能是:

location = /auth/test.php {
    fastcgi_param USERNAME $arg_username;
    fastcgi_param PASSWORD $arg_password;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root/auth/test.php;
    include fastcgi_params;
}

答案2

首先,如果您想要 URI 字符串完全匹配,则必须使用“=”。

location = /auth/test.php {

为了处理 .php 文件,location必须是这样的:

location /auth/test.php {
   fastcgi_param SCRIPT_FILENAME $request_filename;
   include fastcgi_params;
}

无论 PHP 是什么版本,这两行都可以处理 PHP。

相关内容