.htaccess Remova o primeiro parâmetro de url do php se o segundo existir

.htaccess Remova o primeiro parâmetro de url do php se o segundo existir

Este é o meu código .htaccess:

RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]

*onde $1 = perfil e $3 = john-smith

Isso funciona bem reescrevendo comohttps://example.com/profile/john-smithmas preciso de uma segunda regra de reescrita comohttps://example.com/john-smithsomente se o segundo parâmetro que contém john-smith existir.

Obrigado!

ATUALIZAÇÃO: (Regras completas do meu arquivo .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]

Responder1

RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]

O "problema" disso é que ele também corresponderá a uma solicitação for /john-smith(o segundo grupo é opcional), mas reescreverá a solicitação para pages.php?PAGE=john-smith&LINK=, em vez de pages.php?LINK=john-smithconforme necessário. Para isso você precisará de uma regra separada. Ele também corresponde /profile/john-smith/anything, descartando, /anythingmas ainda reescrevendo a solicitação (um relacionamento muitos para um), que potencialmente abre seu site para spammers.

Supondo que você não esteja permitindo pontos ( .) nos segmentos do caminho da URL (conforme seus exemplos), não há necessidade de verificar se a solicitação não é mapeada para um arquivo. por exemplo. uma solicitação /profile/john-smithnunca poderia ser mapeada para arquivo se todos os seus arquivos tivessem extensões de arquivo, portanto, a verificação do sistema de arquivos é redundante.

Em vez disso, tente o seguinte:

# 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]

O NCsinalizador da RewriteConddiretiva anterior é provavelmente redundante.

([^/.]+)- Alterei o subpadrão de captura para excluir também os pontos. E a segunda regra corresponde exatamente a dois segmentos de caminho, não a umoudois segmentos de caminho, como no seu exemplo.

informação relacionada