我正在尝试使用nginx配置实现以下结果:
一个PHP应用程序正在服务器的子目录中运行
php artisan
。 server.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;
}
}
但是我担心这可能会允许不需要的文件访问。有什么意见吗?
答案 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
可能?)