我有一堆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;
}
1条答案
按热度按时间iih3973s1#
Try_files不包含$query_string参数
nginx try_files按照指定的顺序检查文件是否存在,并使用第一个找到的文件>进行请求处理;在当前上下文中执行处理。文件的>路径是根据root和>alias指令从file参数构造的。可以通过在名称的末尾指定一个>斜杠来检查目录的存在,例如。“$uri/"。如果没有找到任何文件,则进行到最后一个参数中指定的uri的>内部重定向。
试试这个:
更新
这个工作对我来说
无**=404**
最后一个参数必须是代码或文件
try_files文件…uri;
try_files文件…=code;
如果设置**=404**,nginx会将前面的选项解释为检查文件/dir是否存在,找不到
"/file-pickup.php?path=$upload_path"
文件/dir并返回404。