Este es mi código .htaccess:
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]
*donde $1 = perfil y $3 = john-smith
Esto funciona bien reescribiendo comohttps://ejemplo.com/profile/john-smithpero necesito una segunda regla de reescritura comohttps://ejemplo.com/john-smithsolo si existe el segundo parámetro que contiene john-smith.
¡Gracias!
ACTUALIZACIÓN: (Reglas completas de mi archivo .htaccess)
# protect files beginning with .
RewriteRule /\.(.*) - [NC,F]
# redirect HTTPS
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
# No root access without index.* and other security
RewriteEngine On
Options All -Indexes
RewriteBase /
DirectoryIndex index.php index.html index.htm
ErrorDocument 404 https://example.com/pages.php?PAGE=404
# Prevent upload malicious PHP files
<FilesMatch “\.(php|php\.)$”>
Order Allow,Deny
Deny from all
</FilesMatch>
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [QSA, L]
Respuesta1
RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]
El "problema" con esto es que también coincidirá con una solicitud para /john-smith
(el segundo grupo es opcional), pero reescribe la solicitud en pages.php?PAGE=john-smith&LINK=
, en lugar de pages.php?LINK=john-smith
como se requiere. Para ello necesitarás una regla aparte. También coincide /profile/john-smith/anything
, descartando /anything
pero aún reescribiendo la solicitud (una relación de muchos a uno), lo que potencialmente abre su sitio a los spammers.
Suponiendo que no permite puntos ( .
) en los segmentos de ruta URL (según sus ejemplos), no es necesario verificar que la solicitud no se asigne a un archivo. p.ej. una solicitud /profile/john-smith
nunca podría asignarse a un archivo si todos sus archivos tienen extensiones de archivo, por lo que la verificación del sistema de archivos es redundante.
Pruebe lo siguiente en su lugar:
# Rewrite exactly one path segment
# eg. /john-smith to pages.php?LINK=john-smith
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)$ pages.php?LINK=$1 [L]
# Rewrite exactly two path segments
# eg. /profile/john-smith to pages.php?PAGE=profile&LINK=john-smith
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)/([^/.]+)$ pages.php?PAGE=$1&LINK=$2 [L]
La NC
indicación de la RewriteCond
directiva anterior probablemente sea redundante.
([^/.]+)
- Cambié el subpatrón de captura para excluir también los puntos. Y la segunda regla coincide exactamente con dos segmentos del camino, no con uno.odos segmentos de ruta, como en su ejemplo.