Warum arbeiten beide Regeln nicht zusammen und wie kann ich das beheben? Nur das erste funktioniert ... Ich denke, dass es einen Konflikt zwischen den beiden Regeln gibt, aber ich habe noch keine Lösung gefunden
?p=
ist die Abfragezeichenfolge, mit der ich auf die Dateien zugreife, die sich im Hauptverzeichnis meiner Website befinden, und ?page=
ist für ein Unterverzeichnis.
Meine aktuellen URLs sind:
https://example.com/?p=home
https://example.com/?page=article
https://example.com/?page=article&tab=2
Und ich möchte, dass es wird:
https://example.com/home
https://example.com/article
https://example.com/article/2
.htaccess:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ index.php?p=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ index.php?page=$1 [L]
Ja, du hast einen Konflikt.
.htaccess
haben genau die gleichen Bedingungen, daher gewinnt immer die erste. Die zweite wird niemals ausgeführt.Sie müssen einen Schritt zurückgehen, bevor Sie versuchen, Code zu schreiben. Wie würden Sie die folgenden URLs auflösen:
https://example.com/home
https://example.com/article
https://example.com/foo
Woher wissen Sie, dass home
zu ?p=home
aufgelöst werden soll und article
zu ?page=article
aufgelöst werden soll? Was ist mit foo
? Sie können nur "sehen", was in der URL enthalten ist.
Sie müssen entweder:
example.com/p/home
vs example.com/pg/home
Wenn die Anzahl der in ?p=
(oder ?page=
) umgeschriebenen URLs begrenzt ist, können Sie die URL-Muster in Ihrer Direktive buchstäblich auflisten. Und alles andere geht an ?page=
(oder ?p=
). Zum Beispiel:
RewriteRule ^(home|about)$ index.php?p=$1 [L]
:
RewriteRule ^([^/]+)$ index.php?page=$1 [L]
Schreibe alles in einen einzelnen URL-Parameter (zB ?page=
) und entscheide in deinem PHP, wie die Seite sein soll serviert. Dies scheint die logischere Lösung zu sein, da Sie in beiden Szenarien ohnehin auf index.php
umschreiben und nicht weiter .htaccess
bearbeiten müssen. Dies könnte auch den zusätzlichen tab
"Parameter" behandeln.
Der zusätzliche "tab" -Parameter
Wenn alle URLs mit einem zweiten Pfadsegment in ?page=
umgeschrieben werden sollen, ist dies möglicherweise ein "erkennbarer" Unterschied. Dies schlägt jedoch derzeit fehl, wenn das zweite Pfadsegment weggelassen wird, wie in /article
. Wie soll damit umgegangen werden?
die Dateien zu
?page=
befinden sich in einem Unterverzeichnis, und die URL könnte folgendermaßen lauten:https://example.com/news-folder/article
Ihre Frage bezog sich nicht auf ein Unterverzeichnis. Dies würde ausreichen, um den "Typ" von URLs zu unterscheiden und die URLs anders schreiben zu können.
Zum Beispiel:
RewriteEngine On
# Stop processing if the request looks like it maps to a physical resource
RewriteCond %{REQUEST_URI} \.(?:gif|jpg|png|css|js)$ [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# Single path segment rewrite to ?p=
RewriteRule ^([^/]+)$ index.php?p=$1 [L]
# Requests for files in the subdirectory rewrite to ?page=
RewriteRule ^news-folder/([^/]+)$ index.php?page=$1 [L]
# Requests for files in the subdirectory with additional numeric "tab"
RewriteRule ^news-folder/([^/]+)/(\d+)$ index.php?page=$1&tab=$2 [L]
Die letzten beiden Regeln können kombiniert werden, wenn Sie einen leeren tab
-Parameter haben. z.B. example.com/news-folder/article
würde example.com/index.php?page=article&tab=
umgeschrieben. Derzeit sind die Direktiven getrennt, sodass der Parameter tab
überhaupt nicht vorhanden ist, wenn /2
(zum Beispiel) nicht angehängt wird.
PDATE: Die Dateisystemprüfungen (für statische Ressourcen und um eine Überschreibungsschleife zu verhindern) könnten vollständig weggelassen werden, wenn Sie mit der Regex, die Sie zum Ausrichten Ihrer Artikelseiten verwenden, restriktiver sind. Zum Beispiel:
RewriteEngine On
# Single path segment rewrite to ?p=
RewriteRule ^([^/.]+)$ index.php?p=$1 [L]
# Requests for files in the subdirectory rewrite to ?page=
RewriteRule ^news-folder/([^/.]+)$ index.php?page=$1 [L]
# Requests for files in the subdirectory with additional numeric "tab"
RewriteRule ^news-folder/([^/.]+)/(\d+)$ index.php?page=$1&tab=$2 [L]
Dies bedeutet nur, dass Ihre URLs zu Ihren Seiten nicht .
(Punkt) enthalten dürfen. Sie könnten restriktiver sein und nur Word-Zeichen (plus Bindestrich) zulassen und [^/.]+
in [\w-]+
ändern. Dies erlaubt dann Artikelnamen, die nur aus den Zeichen bestehen: 0-9
, a-z
, A-Z
, _
und -
.
Sie können das Unterverzeichnis /news-folder
vollständig generisch machen und mit jedem Unterverzeichnis übereinstimmen. Zum Beispiel:
RewriteRule ^\w+/(\w+)$ index.php?page=$1 [L]
Nun würde jede Anfrage für /<something>/article
in index.php?page=article
umgeschrieben.