Restler无法处理带后缀的URL返回404,请求技术解决方案
解决Restler处理带.jpg后缀URL的404问题
核心原因
Web服务器(如Apache/Nginx)会优先将带.jpg后缀的请求视为静态文件,尝试在服务器目录中查找对应文件,找不到时直接返回404,根本没把请求交给Restler处理;另外Restler默认的路由参数匹配规则未包含.字符,导致即使请求到达Restler也无法匹配到对应接口。
解决方案
1. 修改Web服务器配置,让动态请求交给Restler处理
Apache(.htaccess)
确保.htaccess文件添加以下规则,让不存在的静态文件请求转发到Restler入口文件(通常是index.php):
RewriteEngine On # 排除真实存在的文件和目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 将所有请求转发到index.php RewriteRule ^(.*)$ index.php [QSA,L]
Nginx
在站点配置的location块中添加try_files指令,确保静态文件不存在时交给Restler处理:
location / { try_files $uri $uri/ /index.php?$query_string; }
2. 调整Restler接口的参数匹配规则
修改接口注释中$id参数的匹配模式,允许包含.字符:
/** * image api * * @status 200 * @url GET xxx/image/upload3/{params}/{dir}/{id} * * @param mixed $params {@from path} * @param mixed $dir {@from path} * @param mixed $id {@from path} {@pattern [a-zA-Z0-9_\.]+} * * @return mixed * * @throws RestException */ public function screenshot($params, $dir, $id) { die('xxx'); $this->showImage($params, $dir, $id); }
这里的{@pattern [a-zA-Z0-9_\.]+}允许$id参数包含字母、数字、下划线和点号,完美匹配带.jpg后缀的文件名。
备选方案:修改路由URL包含后缀
如果不想修改参数匹配模式,也可以直接把.jpg后缀写到路由规则里,此时$id就不带后缀:
/** * image api * * @status 200 * @url GET xxx/image/upload3/{params}/{dir}/{id}.jpg * * @param mixed $params {@from path} * @param mixed $dir {@from path} * @param mixed $id {@from path} * * @return mixed * * @throws RestException */ public function screenshot($params, $dir, $id) { die('xxx'); // 如果需要完整文件名,这里可以拼接后缀:$fullId = $id . '.jpg'; $this->showImage($params, $dir, $id); }
内容的提问来源于stack exchange,提问作者Čamo
相关产品推荐
相关产品推荐

