.htaccess Eliminar el primer parámetro de URL de php si existe el segundo

.htaccess Eliminar el primer parámetro de URL de php si existe el segundo

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-smithcomo se requiere. Para ello necesitarás una regla aparte. También coincide /profile/john-smith/anything, descartando /anythingpero 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-smithnunca 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 NCindicación de la RewriteConddirectiva 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.

información relacionada