【问题标题】:Nginx with multiple locations serving some php files as download具有多个位置的 Nginx 提供一些 php 文件作为下载
【发布时间】:2020-08-21 08:43:29
【问题描述】:

我有两个目录,/home/php/www/public/ 和 /home/php/www/private/,我想根据 uri 的第一部分提供哪个目录。

我希望 /foo/ 以“正常”方式运行,因为它应该服务于该位置中的任何文件,例如 mysite.com/about 将服务于 /public/about.php。但是,无论请求如何,/private/ 始终会提供单个文件,例如 mysite.com/private/foo、mysite.com/private/bar 和 mysite.com/private/foo/test 都将服务于 /private/app。 php.

与我在这里和其他谷歌看到的不同,我可能有 100 多种不同的变体,但对所有这些都非常陌生,似乎无法准确地拼凑出我需要的东西。经过几天的反复试验,我接近了我所追求的,mysite.com/about 正确地服务 /public/about.php 和 mysite.com/private/whatever 得到 /private/app.php 但它没有执行它,它会将其用作下载。

这是我目前所拥有的:

server {                                                                                 

        listen 80;                                                                       
        listen [::]:80;                                                                  

        root /home/php/www/public;                                                       

        index index.php;                                                                 

        server_name mysite.com;                                        

        location /private/ {                                                                
                alias /home/php/www/private;                                                 
                try_files /app.php =404;                                              

                location ~ [^/]\.php(/|$) {                                              
#               location ~ \.php$ {                                                      
#                       fastcgi_split_path_info ^(.+\.php)(/.+)$;                        
                        include snippets/fastcgi-php.conf;                               
                        fastcgi_pass unix:/run/php/php7.2-fpm.sock;                      

#                       fastcgi_index app.php;                                        
#                       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#                       include fastcgi_params;                                          

#                       return 302 https://google.com;                                   
                }                                                                        
        }                                                                                

        location / {                                                                     
                try_files $uri $uri.html $uri/ @extensionless-php;                       
        }                                                                                

        location ~ \.php$ {                                                              
                include snippets/fastcgi-php.conf;                                       
                fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        }

        location @extensionless-php {
                rewrite ^(.*)$ $1.php last;
        }

        location ~ /\.ht {
                deny all;
        }
}

如果我将 location /private/ 块内的所有内容都替换为 return 302 https://google.com 它会成功重定向到 google.com,所以我知道这个位置块正在返回,但将相同的东西放在 location ~ \.php$location /private/ 内什么都没有发生在我身上,看起来它没有击中这个街区,我错过了什么? /var/log/nginx/error.log 中没有与此相关的任何错误。

【问题讨论】:

    标签: php nginx


    【解决方案1】:

    试试:

    location /private/ {                                                                
        root /home/php/www/private;
        try_files /app.php =404;
    
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }
    

    使用root 而不是alias,因为您不想为原始请求设置别名。由于不必要的嵌套 location 块,文件已下载。

    【讨论】:

    • 感谢您抽出宝贵时间回复 Richard。我已经尝试了您的建议,将其更改为 root 并没有改变任何内容,但我认为这是正确的做法,所以谢谢。当我得到nginx: [emerg] "try_files" directive is duplicate in /etc/nginx/snippets/fastcgi-php.conf:5 时,我不得不从这个位置块中删除 php 的 2 行,我猜是因为已经有一个块只是为了这个更远的地方,但为什么它不匹配?我需要那个块来处理其他页面,所以不能删除它,可以吗?
    • 如果您不想取消选中snippets/fastcgi-php.conf,可以将第一个try_files 语句更改为rewrite ^ /app.php break;,看看是否可行。
    • 好吧这不是因为它下面的块,删除include snippets/fastcgi-php.conf;清除了nginx错误,但它仍然无法正常工作。
    • 很抱歉在评论之前没有刷新页面。我已经尝试过了,它仍然没有获取 PHP 并且正在作为下载提供。
    猜你喜欢
    • 2016-04-22
    • 1970-01-01
    • 2014-10-24
    • 2017-09-13
    • 2018-12-08
    • 2011-01-15
    • 2019-11-20
    • 1970-01-01
    • 2014-09-22
    相关资源
    最近更新 更多