Nginx try_files到RegEx位置的PHP脚本

mzmfm0qo  于 2023-06-21  发布在  Nginx
关注(0)|答案(1)|浏览(130)

我有一堆URL,比如https://example.com/uploads/x/y/z.pdf,我需要将它们路由到PHP脚本来执行一些额外的权限检查。我认为下面的位置块就足够了,但它导致了404:

location ~ ^/uploads/(?<upload_path>.*) {
    try_files /file-pickup.php?path=$upload_path =404;
}

文件file-pickup.php肯定存在于root中,如果我直接访问该路径,比如https://example.com/file-pickup.php?path=x/y/z.pdf,我的PHP脚本就会被正确调用。
我还将=404更改为=403,只是为了确保该块接收到该指令。
这样做的目的是没有一个301/302重定向,至少是通过Nginx。我的脚本将负责逻辑,并根据需要进行传递或重定向。
上面的指令后面紧跟着下面的块,这两个块都正常工作。

location / {
        try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
        try_files $uri =404;

        include fastcgi.conf;
        fastcgi_pass unix:/var/run/php-fpm/example.sock;
}
iih3973s

iih3973s1#

Try_files不包含$query_string参数
nginx try_files按照指定的顺序检查文件是否存在,并使用第一个找到的文件>进行请求处理;在当前上下文中执行处理。文件的>路径是根据root和>alias指令从file参数构造的。可以通过在名称的末尾指定一个>斜杠来检查目录的存在,例如。“$uri/"。如果没有找到任何文件,则进行到最后一个参数中指定的uri的>内部重定向。
试试这个:

location ~ ^/uploads/(?<upload_path>.*) {
  rewrite ^ /file-pickup.php?path=$upload_path;
}
location ~ \.php$ {
....your php hendler...
}

更新

这个工作对我来说

location ~ ^/uploads/(?<upload_path>.*) {
  try_files $uri /file-pickup.php?path=$upload_path;
}

无**=404**
最后一个参数必须是代码或文件
try_files文件…uri;
try_files文件…=code;
如果设置**=404**,nginx会将前面的选项解释为检查文件/dir是否存在,找不到"/file-pickup.php?path=$upload_path"文件/dir并返回404。

相关问题