.htaccess Entfernen Sie den ersten PHP-URL-Parameter, wenn der zweite vorhanden ist

.htaccess Entfernen Sie den ersten PHP-URL-Parameter, wenn der zweite vorhanden ist

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-smithwie erforderlich. Dafür benötigen Sie eine separate Regel. Es stimmt auch mit überein /profile/john-smith/anything, verwirft /anythingdie 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-smithkö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 NCFlag der vorhergehenden RewriteCondAnweisung 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.

verwandte Informationen