我试图使用.htaccess为我的网站制作漂亮的URL。下面是代码:
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页面中,我有一个简单的视图计数器:
$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服务器不太了解)。
有什么原因吗?
发布于 2020-03-17 12:43:44
在你发布的代码中似乎没有什么好的理由,为什么柜台会像这样疯狂呢?但是,您发布的.htaccess指令根本不会被处理,比如example.com/post/78 (没有斜杠)或example.com/post/78/ (带有斜杠)--正则表达式根本不匹配。这表明启用了MultiViews。
另外,当您在URL参数中传递这个变量时,从REQUEST_URI服务器变量中提取REQUEST_URI似乎很奇怪吗?这也表明MultiViews正在接手。您需要禁用MultiViews才能使这些指令按预期的方式工作。在.htaccess文件的顶部,您应该添加以下内容:
# Disable MultiViews
Options -MultiViews因为/post/78直接映射到同名但具有.php扩展名的文件,所以启用MultiViews的mod_negotiation最终会发出一个/post.php的内部子请求--没有任何URL参数。
请注意,您发布的指令似乎只匹配表单/post/<id>/<postname>的URL(有或没有尾随斜杠)。为了只匹配/post/<id>,您需要一个额外的指令,或者修改现有的指令来匹配这两个指令。
例如:
RewriteRule ^post/([^/]+)(?:/([^/]+))?/?$ post.php?id=$1&name=$2 [NC,L]https://stackoverflow.com/questions/60712464
复制相似问题