Reescribir la regla de .htaccess en Apache VirtualHost
Tengo el siguiente .htaccess
archivo:
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
</IfModule>
RewriteBase /
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /API/index.php [L]
¿Es posible convertir las reglas anteriores en VirtualHost
bloques utilizables ?
<VirtualHost *:80>
ServerAdmin webmaster@web-api
DocumentRoot "/Users/shot/git/web-api"
ServerName web-api
ServerAlias web-api
ErrorLog "/private/var/log/apache2/web-api-error_log"
CustomLog "/private/var/log/apache2/web-api-access_log" common
RewriteEngine on
<Directory "/Users/shot/git/web-api">
Options FollowSymLinks
Order allow,deny
Allow from all
Require all granted
RewriteBase /
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /API/index.php [L]
</Directory>
</VirtualHost>
Pero en el registro de errores de Apache, obtengo el siguiente resultado [core:error] [pid 2520] [client 127.0.0.1:52625] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
Respuestas
Si desea poner esas directivas directamente dentro de VirtualHost
(es decir, no dentro de un <Directory>
contenedor), puede reescribirlas así:
Options +FollowSymlinks
RewriteEngine On
RewriteRule ^ - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{LA-U:REQUEST_FILENAME} !-f
RewriteCond %{LA-U:REQUEST_FILENAME} !-d
RewriteRule ^/. /API/index.php [L]
Cambios requeridos:
Cuando se procesan las directivas vhost, la solicitud aún no se ha asignado al sistema de archivos, de ahí la necesidad de usar un look-ahead (
LA-U:REQUEST_FILENANE
) para obtener el nombre de archivo resultante.En un contexto de host virtual, la ruta URL que coincide con el
RewriteRule
patrón es relativa a la raíz, comenzando con una barra. Entonces, en lugar de.
en.htacces
, necesita/.
(o^/.
) en la configuración de vhost.La
RewriteBase
directiva no se aplica en el contexto de virtualhost, por lo que debe eliminarse. (Aunque no estaba haciendo uso de esto de todos modos en su.htaccess
archivo existente ).
Adicional:
En la directiva que establece la
HTTP_AUTHORIZATION
variable de entorno, el patrón.*
es menos eficiente. Mejor de usar^
(o similar, algo que no tenga que recorrer toda la ruta de URL)Tu
<IfModule>
envoltorio inicial no tiene sentido.