Tengo un sitio web compuesto de la siguiente manera:
index.php page1.php page2.php page3.php - images image1.jpg image2.jpg - style style.css
Quiero escribir un archivo htaccess que pueda darme una URL compatible con SEO. Por ejemplo:
https://example.com/page2.php
debería ser https://example.com/page2
y también:
https://example.com/page2.php#mytab
debe ser https://example.com/page2#mytab
Pero me gustaría aplicar esas reglas solo en el primer directorio, por lo que se puede seguir accediendo a los directorios de "imágenes" y "estilo" utilizando las extensiones.
¿Alguien puede ayudar? Gracias
Ya debería estar enlazando a los archivos sin la extensión .php
en sus URL internas (es decir, href="/page1"
, no href="/page1.php"
). También asumo que sus URL no contienen puntos (que normalmente delimitan la extensión del archivo).
Implemente una reescritura para agregar la extensión .php
si es necesario. Esto debe ir cerca de la parte superior del archivo raíz .htaccess
:
RewriteEngine On # Internally rewrite extenionless URLs to append ".php" if required # Tests only requests (that do not contain a dot) in the root directory RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^([^./]+)$ $1.php [L]
Alternativa para RewriteCond
(verificación del sistema de archivos):
RewriteCond %{REQUEST_FILENAME}.php -f :
Alternativamente, puede eliminar la directiva RewriteCond
por completo para reescribir incondicionalmente todas las solicitudes en la raíz (sin una extensión de archivo) para agregar la extensión .php
.
(OPCIONAL) Si está cambiando la estructura de una URL y eliminando .php
de sus URL y las URL antiguas han sido indexadas por motores de búsqueda y/o vinculadas por terceros, también debe implementar una redirección para eliminar la extensión .php
para SEO.
Agregue lo siguiente inmediatamente después de la directiva RewriteEngine
anterior (antes de la reescritura interna):
# Redirect to remove the `.php` extension inbound requests # Only affects the root directory RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^([^./]+)\.php$ /$1 [R=301,L]
La condición que prueba contra la variable de entorno REDIRECT_STATUS
asegura que no redirigimos las solicitudes ya reescritas por la reescritura posterior y esto evita un bucle de redirección.
NB: pruebe primero con una redirección 302 (temporal) para evitar posibles problemas de almacenamiento en caché.
Alternativamente (en lugar de # 3 ), para evitar el acceso directo al archivo .php
y mostrar un 404 Not Found en su lugar, agregue lo siguiente inmediatamente después de la directiva RewriteEngine
anterior (antes de la reescritura interna):
# Prevent direct access to ".php" file and serve a 404 instead # Only affects the root directory RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^([^./]+)\.php$ - [R=404]
¿Cuál es la mejor manera de mostrar el contenido de mi página 404 personalizada cada vez que ocurre un error 404? (No me gustaría usar la redirección)
Use lo siguiente en la parte superior del archivo .htaccess
, pasando la ruta URL completa a la directiva ErrorDocument
.
ErrorDocument 404 /error-docs/e404.php
El documento de error indicado se llama mediante una subsolicitud interna (no hay redirección externa).
Tenga en cuenta que esto debe incluir la extensión de archivo .php
aquí; esto es completamente invisible para el usuario.