我正在尝试在nginx中设置虚拟位置,以便从目录中提供大型静态文件。 主应用程序是symfony2程序。
我想要的是拥有一个可以在GET参数中指定文件路径的URL,这样nginx可以直接向客户端提供文件。
在我的示例中,位置为/ getfile
到目前为止,这是我的配置
server
{
listen 80;
server_name website_url;
set $path_web /myapp/webdir;
client_max_body_size 200m;
location /getfile {
root /path_to_dir;
if ($args ~ ^oid=(.*+)) {
set $key1 $1;
rewrite ^.*$ $key1;
}
}
location ~ \.php($|/)
{
set $script $uri;
set $path_info "";
if ($uri ~ "^(.+\.php)(.*)") {
set $script $1;
set $path_info $2;
}
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $path_web$script;
fastcgi_param SCRIPT_NAME $script;
fastcgi_param PATH_INFO $path_info;
include /etc/nginx/conf.d/fastcgi.conf;
}
root $path_web;
index app.php app_dev.php;
location /
{
set $idx_file app.php;
if ($args ~ debug=true) {
set $idx_file app_dev.php;
}
if ( !-f $request_filename) {
rewrite ^(.*)$ /$idx_file last;
}
}
location ~ /\.ht
{
deny all;
}
# logs path
access_log /path_to_logdir/access.log main;
error_log /path_to_logdir/error.log;
}
答案 0 :(得分:1)
我添加了我的答案,因为没有明确的答案。 我宁愿使用try_files,所以看起来就像那样。
location /my/path {
# try to serve file directly, fallback to rewrite
try_files $uri $uri @rewrite;
}
location @rewrite {
rewrite ^/(.*)$ /app.php/$1 last;
}
然后服务器将首先在给定路径上查找图像,如果没有找到则回退到app.php。它比ifs和elses要好得多,因为它永远不会回溯到app.php。
答案 1 :(得分:0)
虽然我不确定这是否有用,但您使用了if
和set
以及rewrite
,这些东西太多了,我会尝试这个
location /getfile?oid=(.*) {
rewrite ^ /path/$1;
}