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-smith
conforme necessário. Para isso você precisará de uma regra separada. Ele também corresponde /profile/john-smith/anything
, descartando, /anything
mas 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-smith
nunca 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 NC
sinalizador da RewriteCond
diretiva 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.