php счетчик сходит с ума от .htaccess - PullRequest
1 голос
/ 16 марта 2020

Я пытаюсь использовать .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);

Теперь вот моя проблема: когда я go к URL example.com/post/78 (без конечного пункта sh) все работает отлично. Счетчик получает то, что находится в базе данных, и увеличивает его на 1, как и положено. Однако, если я поставлю окончательное значение sla sh (example.com/post/78/), счетчик увеличится до 26. Очевидно, то же самое происходит, когда я передаю другой параметр (например, как я собираюсь это сделать - example.com/post/78/postname/).

Счетчик не имеет никакого другого приращения на странице, поэтому я предполагаю, что он выполняет страницу несколько раз (если это вообще возможно, я не знаю много о веб-серверах).

Любые идеи что может быть причиной этого?

1 Ответ

0 голосов
/ 17 марта 2020

Кажется, что в коде, который вы разместили, нет веской причины, почему счетчик должен сходить с ума? Однако опубликованные вами директивы .htaccess вообще не будут обрабатываться для запроса типа example.com/post/78 (без sla sh) или example.com/post/78/ (с sla sh) - регулярное выражение просто не соответствует , Это говорит о том, что MultiViews включено.

Также кажется странным, что вы извлекаете id из серверной переменной REQUEST_URI, когда якобы передаете это в параметре URL? Это также предполагает, что MultiViews вступает во владение. Вам нужно отключить MultiViews, чтобы эти директивы работали как задумано. В верхней части файла .htaccess необходимо добавить следующее:

# Disable MultiViews
Options -MultiViews

Поскольку /post/78 отображается непосредственно в файл с тем же именем, но с расширением .php, затем с включенным MultiViews mod_negotiation заканчивает тем, что выдает внутренний подзапрос для /post.php - без каких-либо параметров URL.

Обратите внимание, что опубликованные вами директивы появляются только для соответствия URL-адресам формы /post/<id>/<postname> (с или без конечного sla sh ). Чтобы соответствовать только /post/<id>, вам потребуется дополнительная директива или изменить существующую директиву, чтобы они соответствовали обеим.

Например:

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