.htaccess problema php $ _SERVER ["PATH_INFO"] è vuoto [chiuso]
Sull'host locale stavo eseguendo la mia applicazione php (MVC) con le seguenti regole nel mio .htaccessfile:
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]
Ad esempio localhost/myapp/register/login, caricherà la pagina di accesso. Ma su un server live, ho problemi. Il primo problema che ho dovuto affrontare è stato No input file specified. Leggendo questa risposta ho cambiato questa riga RewriteRule ^(.+)$ index.php/$1 [L]in RewriteRule ^(.*)$ index.php?/$1 [L]. Questo ha risolto il primo problema ma ha creato un altro problema e ora carica sempre la stessa vista e controller predefiniti indipendentemente dall'URL.
Il mio index.php ha le seguenti righe di codice:
$url = isset($_SERVER['PATH_INFO']) ? explode('/', ltrim($_SERVER['PATH_INFO'], '/')) : [];
// Route the request
Router::route($url);
Quindi, ho controllato il valore $ _SERVER ['PATH_INFO'] ed è vuoto. Ora la mia domanda è perché è vuoto e come posso ottenere il normale comportamento degli URL.
Risposte
Finalmente l'ho fatto funzionare. Il mio nuovo
RewriteRuleè . Sto usando invece che nel mio file .RewriteRule ^(.*)$ index.php?/$1 [L,QSA]$_SERVER['REQUEST_URI']$_SERVER['PATH_INFO']index.php
Se stai usando il $_SERVER['REQUEST_URI']tuo codice PHP, probabilmente non dovresti aggiungere una stringa di query (contenente il percorso dell'URL) alla RewriteRule sostituzione (almeno non è necessario ), ad es. Usalo semplicemente RewriteRule . index.php [L].
Il $_SERVER['REQUEST_URI']superglobale PHP contiene solo il percorso URL richiesto, indipendentemente dalla tua RewriteRuledirettiva. Questo contiene anche una potenziale stringa di query (che, in senso stretto, dovresti probabilmente dividere nel tuo codice PHP). (A differenza della variabile del server Apache con lo stesso nome che contiene solo il percorso dell'URL.)
Se invece scegli di passare una stringa di query, come nel tuo "modificato" RewriteRule, non sembra che sia necessario aggiungere il prefisso barra (dal momento che lo rimuovi nel codice PHP). Per esempio:
RewriteRule (.*) index.php?$1 [QSA,L]
Quindi, in index.phpavresti:
$url = !empty($_SERVER['QUERY_STRING']) ? explode('/',$_SERVER['QUERY_STRING']) : [];
Nota che $_SERVER['QUERY_STRING']è sempre impostato, da qui la necessità di controllare !empty(), piuttosto che isset().