Estoy tratando de usar .htaccess para crear direcciones URL bonitas para mi sitio. Aquí está el código:
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] Y dentro de mi página post.php , tengo un contador de vistas simple:
$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); Ahora, aquí está mi problema: cuando voy a la URL example.com/post/78 (sin la barra inclinada final), todo funciona bien. El contador obtiene lo que hay en la base de datos e incrementa en 1 como debería. Sin embargo, si coloco la barra inclinada final ( example.com/post/78/ ), el contador aumenta 26. Obviamente, sucede lo mismo cuando paso otro parámetro (como lo que pretendo hacer - example.com/post/78/postname/ ).
El contador no tiene ningún otro incremento en la página, así que supongo que está ejecutando la página varias veces (si eso es posible, no sé mucho sobre servidores web).
¿Alguna idea de lo que puede estar causando esto?
No parece haber ninguna buena razón en el código que publicaste por la que el contador debería volverse loco de esa manera. Sin embargo, las directivas .htaccess que ha publicado no se procesarán en absoluto para una solicitud como example.com/post/78 (sin barra inclinada) o example.com/post/78/ (con barra inclinada); la expresión regular simplemente lo hace no coincide Esto sugiere que MultiViews está habilitado.
Además, parece extraño que extraiga la id de la variable del servidor REQUEST_URI cuando supuestamente está pasando esto en el parámetro de URL. Esto también sugiere que MultiViews se está haciendo cargo. Necesitará que MultiViews deshabilitado para que estas directivas funcionen según lo previsto. En la parte superior de su archivo .htaccess , debe agregar lo siguiente:
# Disable MultiViews Options -MultiViews Dado que /post/78 se asigna directamente a un archivo del mismo nombre pero con una extensión .php , con MultiViews habilitado mod_negotiation termina emitiendo una subsolicitud interna para /post.php , sin ningún parámetro de URL.
Tenga en cuenta que las directivas que publicó solo parecen coincidir con las URL del formulario /post/<id>/<postname> (con o sin la barra inclinada final). Para hacer coincidir solo /post/<id> , necesitará una directiva adicional o modificar su directiva existente para que coincida con ambas.
Por ejemplo:
RewriteRule ^post/([^/]+)(?:/([^/]+))?/?$ post.php?id=$1&name=$2 [NC,L]