NGINX 配置通配符

NGINX configuration wildcard

我正在为我的项目使用 Symfony2 (PHP) 框架,但在配置我的 NGINX 以捕获到我放在 "web" 目录下的第 3 方库的请求时遇到了一个小问题.

这是我的配置

server {
    listen 80;
    server_name test.com;
    root /var/www/my-symfony-project/web;

    rewrite ^/app\.php/?(.*)$ / permanent;

    location / {
        index app.php;
        try_files $uri @rewriteapp;
    }

    location @rewriteapp {
        rewrite ^(.*)$ /app.php/ last;
    }

    location ~ ^/(app|app_dev|config)\.php(/|$) {
        fastcgi_pass   unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
}

您可能已经注意到根指向“/var/www/my-symfony-project/web”目录。

现在,问题是我在 "web" 目录中有这个 "some-plugin" 文件夹,并且那里有 PHP 文件未被 Symfony2 路由处理。

当我在上面说明的 "server" 块中有以下 "location" 块时,我实际上使它起作用了。

location ~ \.php$ {
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
}

起初使用这种类型的配置似乎没问题,但我们意识到它接受对我们评估为安全漏洞的任何“*.php”文件的请求。

有什么建议吗?

允许访问 .php 文件通常不被认为是危险的或安全漏洞,只要 PHP 文件被执行并且不以其源形式提供,当然,不不要打印任何敏感信息。
如果前者中的任何一个 不是 情况,您可能应该更改设置或代码。

无论如何,您应该能够将 .php 文件处理限制为 /var/www/my-symfony-project/web/some-plugin,方法是使用以下 location:

location ~ ^/var/www/my-symfony-project/web/some-plugin/.*\.php$ {
    # your rules here
}

这应该匹配所有路径以 /var/www/my-symfony-project/web/some-plugin/ 开头并以 .php 结尾的大写或小写文件。