Dies ist mein .htaccess-Code:
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]
*wobei $1 = Profil und $3 = John-Smith
Das funktioniert gut beim Umschreiben wiehttps://example.com/profile/john-smithaber ich brauche eine zweite Umschreibregel wiehttps://example.com/john-smithnur wenn der zweite Parameter, der John-Smith enthält, vorhanden ist.
Danke schön!
UPDATE: (Komplette Regeln meiner .htaccess-Datei)
# 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]
Antwort1
RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]
Das „Problem“ dabei ist, dass es auch mit einer Anfrage für übereinstimmt /john-smith
(die 2. Gruppe ist optional), die Anfrage aber in umschreibt pages.php?PAGE=john-smith&LINK=
, anstatt pages.php?LINK=john-smith
wie erforderlich. Dafür benötigen Sie eine separate Regel. Es stimmt auch mit überein /profile/john-smith/anything
, verwirft /anything
die Anfrage, schreibt sie aber trotzdem um (eine Viele-zu-eins-Beziehung), was Ihre Site potenziell Spammern aussetzt.
Vorausgesetzt, Sie erlauben keine Punkte ( .
) in den URL-Pfadsegmenten (wie in Ihren Beispielen), müssen Sie nicht prüfen, ob die Anforderung nicht einer Datei zugeordnet werden kann. Beispielsweise /profile/john-smith
könnte eine Anforderung nie einer Datei zugeordnet werden, wenn alle Ihre Dateien Dateierweiterungen haben. In diesem Fall ist die Prüfung des Dateisystems überflüssig.
Versuchen Sie stattdessen Folgendes:
# 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]
Das NC
Flag der vorhergehenden RewriteCond
Anweisung ist wahrscheinlich überflüssig.
([^/.]+)
- Ich habe das Erfassungsuntermuster geändert, um auch Punkte auszuschließen. Und die zweite Regel trifft genau auf zwei Pfadsegmente zu, nicht auf einoderzwei Pfadsegmente, wie in Ihrem Beispiel.