Reescribir la regla de .htaccess en Apache VirtualHost

Jul 06 2020

Tengo el siguiente .htaccessarchivo:

<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 VirtualHostbloques 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

MrWhite Jul 07 2020 at 00:04

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 RewriteBasedirectiva 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 .htaccessarchivo existente ).

Adicional:

  • En la directiva que establece la HTTP_AUTHORIZATIONvariable 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.