it-swarm.com.de

Mehrere Regeln zum Umschreiben der URL

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]
3
Derp Dee Derp

Ja, du hast einen Konflikt.

  • Beide Regeln von .htaccess haben genau die gleichen Bedingungen, daher gewinnt immer die erste. Die zweite wird niemals ausgeführt.
  • Ihre URL-Struktur ist nicht eindeutig.

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:

  • Sie haben einen erkennbaren Unterschied zwischen den URLs, sodass Sie wissen, wie Sie sie umschreiben müssen. Zum Beispiel: 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.

2
MrWhite