.htaccess problema php $_SERVER['PATH_INFO'] está vacío

.htaccess problema php $_SERVER['PATH_INFO'] está vacío

En el host local estaba ejecutando mi aplicación php (MVC) con las siguientes reglas en mi .htaccessarchivo:

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]

Por ejemplo, localhost/myapp/register/logincargará la página de inicio de sesión. Pero en un servidor en vivo, tengo problemas. El primer problema al que me enfrenté fue No input file specified. Lecturaesta respuestaCambié esta línea RewriteRule ^(.+)$ index.php/$1 [L]a RewriteRule ^(.*)$ index.php?/$1 [L]. Esto resolvió el primer problema pero creó otro problema y ahora siempre carga la misma vista y controlador predeterminados sin importar cuál sea la URL.

Mi index.php tiene las siguientes líneas de código:

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

Entonces, verifiqué el valor $_SERVER['PATH_INFO'] y está vacío. Ahora mi pregunta es por qué está vacío y cómo puedo lograr el comportamiento normal de las URL.

Respuesta1

Finalmente lo hice funcionar. Mi nuevo RewriteRulees RewriteRule ^(.*)$ index.php?/$1 [L,QSA]. Estoy usando $_SERVER['REQUEST_URI']en lugar de $_SERVER['PATH_INFO']en mi index.php.

Si está utilizando $_SERVER['REQUEST_URI']en su código PHP, probablemente no debería agregar una cadena de consulta (que contenga la ruta URL) alRewriteRule sustitución(al menos no lo hacesnecesidada), es decir. Simplemente utilícelo RewriteRule . index.php [L]en su lugar.

El $_SERVER['REQUEST_URI']PHP superglobal contiene únicamente la ruta URL solicitada, independientemente de su RewriteRuledirectiva. Esto también contiene una cadena de consulta potencial (que, estrictamente hablando, probablemente deberías dividir en tu código PHP). (A diferencia de la variable del servidor Apache del mismo nombre que solo contiene la ruta URL).


Si, en cambio, elige pasar una cadena de consulta, como en su "cambiado" RewriteRule, entonces no parece que necesite agregar el prefijo de barra diagonal (ya que lo elimina en su código PHP). Por ejemplo:

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

Entonces, en index.phpti tendrías:

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

Tenga en cuenta que $_SERVER['QUERY_STRING']essiempreestablecido, de ahí la necesidad de verificar !empty(), en lugar de isset().

información relacionada