.htaccess Problem php $ _SERVER ['PATH_INFO'] ist leer [geschlossen]

Sep 01 2020

Auf dem lokalen Host habe ich meine PHP-Anwendung (MVC) mit den folgenden Regeln in meiner .htaccessDatei ausgeführt:

Options -Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^(config|core|css|js|fonts|images|robots\.txt) RewriteRule ^(.+)$ index.php/$1 [L]

ZB localhost/myapp/register/loginwird die Anmeldeseite geladen. Aber auf einem Live-Server habe ich Probleme. Das erste Problem, mit dem ich konfrontiert war, war No input file specified. Als ich diese Antwort las, änderte ich diese Zeile RewriteRule ^(.+)$ index.php/$1 [L]in RewriteRule ^(.*)$ index.php?/$1 [L]. Dies löste das erste Problem, verursachte jedoch ein weiteres Problem und lädt jetzt immer dieselbe / Standardansicht und denselben Controller, unabhängig von der URL.

Meine index.php enthält die folgenden Codezeilen:

$url = isset($_SERVER['PATH_INFO']) ? explode('/', ltrim($_SERVER['PATH_INFO'], '/')) : [];
 // Route the request
 Router::route($url);

Also habe ich den Wert von $ _SERVER ['PATH_INFO'] überprüft und er ist leer. Jetzt ist meine Frage, warum es leer ist und wie ich das normale Verhalten der URLs erreichen kann.

Antworten

MrWhite Sep 03 2020 at 17:03

Endlich habe ich es geschafft. Mein neues RewriteRuleist . Ich benutze statt in meinem .RewriteRule ^(.*)$ index.php?/$1 [L,QSA]$_SERVER['REQUEST_URI']$_SERVER['PATH_INFO']index.php

Wenn Sie verwenden $_SERVER['REQUEST_URI']in Ihrem PHP - Code , dann sollten Sie wahrscheinlich nicht eine Abfrage - Zeichenfolge (mit dem URL-Pfad) werden angehängt an die RewriteRule Substitution (zumindest nicht wahr müssen zu), dh. Verwenden Sie RewriteRule . index.php [L]stattdessen einfach .

Das $_SERVER['REQUEST_URI']PHP-Superglobal enthält unabhängig von Ihrer RewriteRuleDirektive nur den angeforderten URL-Pfad . Dies enthält auch eine mögliche Abfragezeichenfolge (die Sie streng genommen wahrscheinlich in Ihren PHP-Code aufteilen sollten). (Im Gegensatz zur gleichnamigen Apache-Servervariablen, die nur den URL-Pfad enthält.)


Wenn Sie stattdessen eine Abfragezeichenfolge übergeben, wie in Ihrer "geänderten" RewriteRule, müssen Sie anscheinend kein Schrägstrichpräfix hinzufügen (da Sie diese in Ihrem PHP-Code entfernen). Beispielsweise:

RewriteRule (.*) index.php?$1 [QSA,L]

Dann index.phphätten Sie in:

$url = !empty($_SERVER['QUERY_STRING']) ? explode('/',$_SERVER['QUERY_STRING']) : [];

Beachten Sie, dass $_SERVER['QUERY_STRING']ist immer gesetzt, daher die Notwendigkeit zu überprüfen !empty(), statt isset().