nginx通过子目录重写规则

时间:2015-04-25 06:19:12

标签: php nginx rewrite

我正在尝试使用nginx配置实现以下结果:

一个PHP应用程序正在服务器的子目录中运行 php artisanserver.com/app/images/中的文件(例如)应该是可访问的,styles/中的php文件应该被执行,而在所有其他情况下,nginx应该在api/之后传递整个字符串将PHP作为GET变量,比如app/

我真的不知道我在这里做了什么,而且我似乎无法在网上找到任何有用的东西,所以如果你能填上,谢谢你。

我正在运行php5-fpm,目前是这样的:

path

请询问您是否需要更多详情。

修改

现在我发现这有效

location /app {
    index index.html index.php;

    access_log /{...}/access.log;
    error_log /{...}/error.log;

    location ~ \.php {
        try_files $uri = 404;
        fastcgi_pass php5-fpm-sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

但是我担心这可能会允许不需要的文件访问。有什么意见吗?

1 个答案:

答案 0 :(得分:1)

您可以通过将try_files指令移出位置子块来简化它,以便您的配置文件最终看起来像:

location /app {    
    index index.php;
    try_files $uri $uri/ /app/index.php?path=$uri;

    access_log /{path}/access.log;
    error_log /{path}/error.log;

    location ~\.php {
        try_files $uri =404;
        fastcgi_pass php5-fpm-sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

}

关键是try_files指令 - nginx将按指定的顺序尝试每个位置。 $uri查找与指定的确切路径匹配的文件(因此/api/random.php正确加载,因为它是一个文件),$uri/查找与路径匹配的文件夹,并尝试加载文件夹中的索引,最后/app/index.php?path=$uri加载页面/app/index.php。然后由location ~\.php块拾取并传递给php-fpm。

我唯一担心的是,您的access和error.log文件可以通过存储在Web目录中公开访问。如果可能的话,将它们移到其他地方(比如/var/log可能?)