¿Qué significa %{REQUEST_FILENAME}.ext? ¿Por qué el final extra .ext?

¿Qué significa %{REQUEST_FILENAME}.ext? ¿Por qué el final extra .ext?

Contiene %{REQUEST_FILENAME}una cadena como esta:

/web/webroot/index.php

Veo que mucha gente recomienda probar si existe un archivo y tiene una extensión .php como esta:

RewriteCond %{REQUEST_FILENAME}.php -f

¿No es redundante el .phpdespués %{REQUEST_FILENAME}? La variable ya debería contener el .php, ¿verdad?

Parece que agregar .phpdespués %{REQUEST_FILENAME}haría que la verificación TestString agregue un .php adicional, como este:

/web/webroot/index.php.php

Me falta algo simple, estoy seguro, pero no sé qué es.

El contexto es este:

RewriteCond %{THE_REQUEST} ^.*?\.php [NC]
RewriteRule ^ - [R=404,NE,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]

Respuesta1

¿No es redundante el .phpdespués %{REQUEST_FILENAME}? La variable ya debería contener el .php, ¿verdad?

Bueno, sí y no, depende de lo que intentes hacer.

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]

Esta regla le permite solicitar URL sin extensión. p.ej. /indexo /fooy esto reescribe internamente la solicitud a /index.phpy /foo.phprespectivamente.

En este caso, REQUEST_FILENAMEes una cadena con el formato /web/webroot/index. Entonces, lo que existe es una prueba /web/webroot/index.phpantes de reescribir lo mismo. Si tuvieras que solicitarlo, /index.phpentonces elcondiciónfalla y no se produce ninguna reescritura (lo cual es correcto).

Sin embargo, esta regla no es estrictamente correcta y podría causar un bucle de reescritura bajo ciertas condiciones. Consulte la siguiente pregunta relacionada:

información relacionada