Apache虚拟主机配置问题:仅放行/api请求其余返回403
解决Apache虚拟主机RewriteRule只放行/api请求的问题
我来帮你搞定这个Rewrite规则的坑!你的当前配置有两个关键问题导致无法正常工作,咱们一步步修复:
问题分析
- 精确匹配限制过严:你写的
RewriteCond %{REQUEST_URI} !^/api$只允许**完全等于/api**的请求通过,但/api/users这类带子路径的合法请求会被误判为非/api请求,直接返回403。 - 规则执行逻辑疏漏:虽然合法的
/api请求能跳过第一个规则,但后续规则没有针对/api路径做针对性调整,可能导致Symfony入口文件无法正确接收请求。
修正后的Rewrite规则
RewriteEngine On # 拦截所有非/api开头的请求,直接返回403 RewriteCond %{REQUEST_URI} !^/api RewriteRule ^ - [F,L] # 将/api下的非静态文件请求转发到Symfony入口文件 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^api/(.*)$ index.php [QSA,L]
规则详解
RewriteCond %{REQUEST_URI} !^/api:匹配所有不是以/api开头的URL,确保/api和所有/api/xxx子路径都能被放行。RewriteRule ^ - [F,L]:-表示不修改请求路径,[F]触发403 Forbidden响应,[L]标记为最后一条规则,避免后续规则干扰非/api请求的处理。RewriteCond %{REQUEST_FILENAME} !-f:检查请求的路径是不是真实存在的静态文件(比如图片、CSS),如果是就直接返回,不用转发到index.php。RewriteRule ^api/(.*)$ index.php [QSA,L]:把/api/后面的所有路径转发到Symfony的index.php,[QSA]保留原请求的查询字符串,[L]终止后续规则执行。
额外说明
如果你的Symfony项目入口文件index.php在子目录(比如public/)下,记得把最后一条规则改成:
RewriteRule ^api/(.*)$ public/index.php [QSA,L]
现在测试一下:访问/、/test这类非/api路径会返回403,访问/api或/api/any/path都会正常转发到Symfony处理啦!
内容的提问来源于stack exchange,提问作者user6461028
相关产品推荐
相关产品推荐

