.htaccess未排除PNG文件导致favicon无法加载 正则是否有误?
问题原因
- base标签配置错误
你使用$_SERVER["PHP_SELF"]作为base href的值,该变量返回的是当前执行PHP脚本的路径(例如站点根目录部署时返回/app.php),会导致页面内所有相对路径都拼接/app.php/作为前缀,实际请求的favicon路径变为/app.php/resources/imgs/logos/android-chrome-512x512.png,该路径并非真实存在的静态文件,会触发重写规则交给app.php处理,无法返回图片资源。 - .htaccess排除规则逻辑错误
现有规则RewriteCond $1 !^(app\.php|robots\.txt|imgs|logos|\.png)仅匹配请求路径开头符合的内容:
.png写在起始匹配符^后,只能匹配路径开头为.png的特殊文件,无法匹配任意路径下后缀为.png的正常图片- 排除的
imgs、logos目录没有匹配上层的resources前缀,实际路径resources/imgs/xxx无法命中排除规则
修复步骤
1. 修正base标签配置
base标签需要指向站点根路径,而非PHP脚本路径,修改为:
<!-- 根目录部署写法 --> <base href="/"> <!-- 子目录部署时修改为对应子目录,例如 <base href="/mysite/"> -->
如果需要保留动态配置,可使用$_SERVER['HTTP_HOST']拼接站点根路径,不要使用PHP_SELF。
2. 优化.htaccess重写规则
你已经配置了RewriteCond %{REQUEST_FILENAME} !-f和RewriteCond %{REQUEST_FILENAME} !-d,正常真实存在的静态文件不会触发重写,若要额外确保静态资源不被重写,可将排除规则修改为匹配后缀的形式:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.*)$ app.php [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 排除所有常见静态资源后缀,NC表示忽略大小写 RewriteCond $1 !\.(png|jpg|jpeg|gif|ico|css|js|txt)$ [NC] RewriteCond $1 !^(app\.php|robots\.txt|resources) [NC] RewriteRule ^(.*)$ app.php?url=$1 [L,QSA]
3. 修正favicon标签配置
你使用png格式作为favicon,type属性不要写image/x-icon(该值仅适用于.ico格式),同时补充标准的rel属性适配不同浏览器:
<link rel="icon" href="resources/imgs/logos/android-chrome-512x512.png" type="image/png"> <link rel="shortcut icon" href="resources/imgs/logos/android-chrome-512x512.png" type="image/png">
内容的提问来源于stack exchange,提问作者NahuCF
相关产品推荐
相关产品推荐

