首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php计数器疯狂使用.htaccess

php计数器疯狂使用.htaccess
EN

Stack Overflow用户
提问于 2020-03-16 19:57:30
回答 1查看 66关注 0票数 1

我试图使用.htaccess为我的网站制作漂亮的URL。下面是代码:

代码语言:javascript
复制
RewriteEngine On
RewriteBase /

ErrorDocument 404 /404.php

RewriteCond %{THE_REQUEST} ^GET\ /post\.php\?id=([^\s&]+)&name=([^\s&]+) [NC]
RewriteRule ^ /post/%1/%2$ [R=301,L,NE]

RewriteRule ^post/([^/]+)/([^/]+)/?$ post.php?id=$1&name=$2 [NC,L]

在我的post.php页面中,我有一个简单的视图计数器:

代码语言:javascript
复制
$url = substr($_SERVER['REQUEST_URI'],1);
$url = explode('/',$url);
$id_post = $purifier->purify($url[1]);
$post = $db->selectone("select p.*, u.username from tx_post p inner join user u on p.id_user = u.id_user where id_post = :id_post",[':id_post'=>$id_post]);

echo 'VIEWS:'.$post['views'].'<br>';
$views = $post['views']+1;
echo 'views after:'.$views.'<br>';
$db->update('tx_post',['views'=>$views],'id_post='.$id_post);

现在我的问题是:当我转到example.com/post/78 (没有最后的斜杠)时,一切都很好。计数器获取数据库中的内容,并按应有的方式递增1。但是,如果我将最后的斜杠(example.com/post/78/)放入,则计数器将增加26。显然,当我传递另一个参数时也会发生同样的事情(比如我打算怎么做- example.com/post/78/postname/)。

计数器在页面上没有任何其他增量,所以我假设它多次执行该页面(如果可能的话,我对web服务器不太了解)。

有什么原因吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-17 12:43:44

在你发布的代码中似乎没有什么好的理由,为什么柜台会像这样疯狂呢?但是,您发布的.htaccess指令根本不会被处理,比如example.com/post/78 (没有斜杠)或example.com/post/78/ (带有斜杠)--正则表达式根本不匹配。这表明启用了MultiViews

另外,当您在URL参数中传递这个变量时,从REQUEST_URI服务器变量中提取REQUEST_URI似乎很奇怪吗?这也表明MultiViews正在接手。您需要禁用MultiViews才能使这些指令按预期的方式工作。在.htaccess文件的顶部,您应该添加以下内容:

代码语言:javascript
复制
# Disable MultiViews
Options -MultiViews

因为/post/78直接映射到同名但具有.php扩展名的文件,所以启用MultiViews的mod_negotiation最终会发出一个/post.php的内部子请求--没有任何URL参数。

请注意,您发布的指令似乎只匹配表单/post/<id>/<postname>的URL(有或没有尾随斜杠)。为了只匹配/post/<id>,您需要一个额外的指令,或者修改现有的指令来匹配这两个指令。

例如:

代码语言:javascript
复制
RewriteRule ^post/([^/]+)(?:/([^/]+))?/?$ post.php?id=$1&name=$2 [NC,L]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60712464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档