php - .htaccess url-rewrite 如果文件不存在 - 如何处理 favicon.ico?

标签 php .htaccess redirect mod-rewrite mysqli

我正在构建自己的 URL 缩短网站,并将其用作我的 .htaccess 文件:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /go.php [L]
</IfModule>

这应该将任何 URL(不是文件)重定向到 go.php,以进行 URL 重定向。

问题是:

当我访问 example.com/keyword 时,我会看到 go.php 页面。然后,我使用以下方法提取关键字:

$url = $_SERVER['REQUEST_URI'];
$keyword = strtok($url, '?');
$keyword = ltrim($keyword,"/");

然后,我将当前关键字及其引荐来源网址 ($_SERVER['HTTP_REFERER]) 插入到数据库中的 log 表中。

一切似乎都工作正常,但在我的日志表中,有两行新行,而不是一行:一行包含正确的关键字 example,另一行包含关键字 favicon.icohttp://example.com/keyword 作为引荐来源网址。

这里到底发生了什么?我只需要第一行和正确的行。这个问题是否只发生在 favicon.ico 上?我该如何解决这个问题?

谢谢!

最佳答案

您的浏览器在请求之后请求 favicon.ico 文件。如果存在,它将使用它作为浏览器选项卡中的图标(例如那个整洁的小 stackoverflow 图标)。

由于您的服务器上不存在该请求,因此该请求将通过所有重写条件。简单地添加一个额外的条件来忽略(不转发到 go.php)favicon 请求。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/favicon.ico$
RewriteRule ^.*$ /go.php [L]

概念证明:http://htaccess.mwl.be?share=f2fa97da-14b9-5c2e-8c58-c2c620b35c76

额外提示,忽略所有 .ico.jpg.css 等(我最喜欢的重写规则):

 RewriteRule !\.(js|ico|gif|jpg|png|css|txt)$ /go.php [L]

关于php - .htaccess url-rewrite 如果文件不存在 - 如何处理 favicon.ico?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45267570/

相关文章:

php读取目录排序

.htaccess - htaccess 文件中的多个重写规则和条件

java - 如何控制 UrlPathHelper#getOriginatingRequestUri

security - 如何处理 HSTS 的端口重定向

php - 在子文件夹中安装 Bolt CMS

redirect - Hapi.js 从 onRequest 重定向

php - 当字符串大小无关紧要时,为什么 strlen() 比使用变量慢

php - 使用 PHP 解析 Google Calendar XML - 结束日期相差一天

PHP:比较null中的运算符顺序

apache - 基于不同主机的 AuthUserFile 的不同路径