htacces 2 Variablen Probleme

Nov 26 2020

Bevor ich SSL installiert habe, haben die Dinge perfekt funktioniert !! Hier ist der Code, den ich in meiner .htaccess-Datei des Root-Webservers habe:

Options +MultiViews
RewriteEngine On
RewriteCond %{HTTP_HOST} andrea\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://andrea.com/$1 [R,L]

RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule (.*) $1.php [L]

Es funktioniert und es macht genau das, was ich will. Also, wenn ich zum Beispiel gehe zu:

www.andrea.com/account

es greift auf "www.andrea.com/account.php" zu. Welches ist was ich will. Ich habe jedoch einen Ordner im Stammverzeichnis namens "Produkte". In diesem Ordner befindet sich eine weitere ".htaccess" -Datei, und ich weiß nicht, welche dieser beiden Dateien geändert werden muss, damit das Folgende funktioniert.

Wenn Sie zu dieser URL gehen: http: ____ / products / view / Hello / Goodbye

Ich möchte, dass es auf "view.php" im Ordner "products" zugreift und in dieser PHP-Datei könnte ich dies tun:

$id = $_GET["id"];    //      This would have "Hello"
$cat = $_GET["cat"];    //   This would have "Goodbye"

Und das funktioniert gut, wenn ich diesen Zugriff im Ordner "Produkte" verwende:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^$ RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2

Das Problem mit diesem Code oben ist, wenn ich gehe zu: http: ____ / products / Hello / Goodbye

Ich möchte, dass es auf die "index.php" zugreift, die sich im Ordner "products" befindet. Aber stattdessen geht es stattdessen zu "view.php" !! Es ist, als ob der obige htaccess-Code alle gezwungen hätte, zu view.php zu wechseln (was nur getan werden sollte, wenn ich die "view / ____" in der URL habe. Ich möchte, dass die obige URL in den "Produkten" zu "index.php" geht "Ordner und in dieser Datei sollte ich in der Lage sein, auf ID- und CAT-Variablen zuzugreifen.

Irgendwelche Ideen, was ich in meiner .htaccess-Datei ändern soll? Es tut mir leid, dass ich mehr als 2 Stunden verbracht habe. Ich verstehe keine einzelne Zeile am Ende meines Codes, aber es funktioniert nicht: /

Antworten

1 AmitVerma Nov 26 2020 at 11:35

Sie können die folgende Regel zu umschreiben verwenden /products/Hello/Goodbyezu /products/index.php.

RewriteRule ^Hello/GoodBye/?$ /product/index.php?id=hello&cat=Goodbye  [L,NC]

Hier ist dein komplettes /product/.htaccess.

RewriteEngine on
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
#rewrite /products/Hello/GoodBye to /products/index.php
RewriteRule ^Hello/GoodBye/?$ /products/index.php?id=Hello&cat=Goodbye [L,NC] ################### RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2
1 MrWhite Nov 27 2020 at 07:13
 Options +MultiViews

Zunächst sollten Sie MultiViews deaktivieren . In meiner Antwort auf Ihre frühere Frage war mein Vorschlag, MultiViews zu verwenden, im Kontext Ihrer Frage eine "alternative" Methode. Sie können nicht beide Methoden (mod_rewrite und MultiViews) verwenden, um mit URLs ohne Erweiterung zu arbeiten. Und da Sie jetzt mehr tun und Parameter übergeben möchten, führt MultiViews nur zu Konflikten. (MultiViews werden wahrscheinlich "gewinnen" und es werden keine Parameter übergeben.)

Benötigen Sie außerdem speziell die zusätzliche .htaccessDatei im /productsUnterverzeichnis? Es wird (wohl) einfacher sein, eine einzelne .htaccessDatei im Dokumentenstamm zu haben. Dadurch wird vermieden, dass die Umleitung von HTTP zu HTTPS wiederholt werden muss (obwohl Sie tatsächlich keine Umleitung von HTTP zu HTTPS in die Unterverzeichnisdatei aufgenommen haben .htaccess?).

# /products/.htaccess
RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2

Diese Anweisung stimmt mit beiden überein view/Hello/Goodbye und Hello/Goodbye erklärt, warum alles in Ihr view.phpSkript geschrieben wird. Es macht jedoch auch nicht das, was Sie sagen - was rätselhaft ist. Wenn Sie eine Anfrage stellen /products/view/Hello/Goodbye, wird die Anfrage umgeschrieben /products/view.php?id=view&cat=Hello/Goodbye- was nicht beabsichtigt ist (es sei denn, MutliViews ist aktiviert. In diesem Fall werden überhaupt keine Parameter übergeben).

Sie müssen viewsden angeforderten URL-Pfad tatsächlich überprüfen, bevor Sie versuchen, ihn neu zu schreiben views.php. Und wenn viewsnicht vorhanden, schreiben Sie index.phpstattdessen um. Diese "bedingte Verzweigung" kann erreicht werden, indem einfach die Anweisungen zuerst in der Reihenfolge "spezifischerer" Regeln angeordnet werden.

.htaccessVersuchen Sie beispielsweise in Ihrer Stammdatei Folgendes. (Und entfernen Sie die /products/.htaccessDatei insgesamt.)

# Ensure that MultiViews is disabled
Options -MultiViews

RewriteEngine On

# HTTP to HTTPS canonical redirect
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://example.com/$1 [R=301,L]

# Abort early if the request already maps to (or looks like) a file or directory
RewriteCond %{REQUEST_URI} \.\w{2,4}$ [OR] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 1. Rewrite "/products/view/<id>/<cat>" to "/products/view.php?id=<id>&cat=<cat> RewriteRule ^(products/view)/([^/]*)/?(.*) $1.php?id=$2&cat=$3 [L]

# 2. Rewrite "/products/<id>/<cat>" to "/products/index.php?id=<id>&cat=<cat>
RewriteRule ^(products)/([^/]*)/?(.*) $1/index.php?id=$2&cat=$3 [L] # 3. Extensionless URLs for other requests RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]

Die Reihenfolge der 3 oben genannten Regeln ist wichtig. Die spezifischste Regel ist die erste. Einschließlich des LFlags, um eine weitere (unnötige) Verarbeitung zu verhindern.

Beachten Sie, dass gemäß Ihren ursprünglichen Anweisungen für eine Anforderung des Formulars /products/view/Hello/Goodbye(oder /products/Hello/Goodbye) das Hello/GoodbyeTeil völlig optional ist und natürlich dazu führt, dass die Parameter idund catURL festgelegt, aber leer sind.

Gemäß Ihren ursprünglichen Anweisungen führt eine Anforderung des Formulars /products/view/Hello/Goodbye/foo/bar/bazdazu, dass der catURL-Parameter auf Goodbye/foo/bar/baz(alles, was dem anfänglichen Pfadsegment folgt) gesetzt wird.

Sie müssen nicht unbedingt überprüfen, ob eine Anforderung einer Datei oder einem Verzeichnis zugeordnet ist (was relativ teuer ist ), wenn Sie Ihren regulären Ausdruck spezifischer gestalten und nur mit dem übereinstimmen, was Sie benötigen. Zum Beispiel stimmt Ihre Regex /([^/]*)/?(.*)derzeit mit so ziemlich allem überein . Wenn Ihre <id>und <cat>Variablen jedoch nur aus Kleinbuchstaben bestehen können (z. B.), kann dies die Notwendigkeit von Dateisystemprüfungen vermeiden.

Weitere Hinweise:

  • Müssen Sie den Hostnamen in der HTTP-zu-HTTPS-Umleitung überprüfen? Hosten Sie mehrere Domains? Andernfalls ist die Bedingung, die die HTTP_HOSTServervariable überprüft, nicht erforderlich.