Schreiben Sie die Regel von .htaccess in Apache VirtualHost um

Jul 06 2020

Ich habe die folgende .htaccessDatei:

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

Ist es möglich, die oben genannten Regeln in verwendbare VirtualHostBlöcke umzuwandeln ?

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

Aber im Apache-Fehlerprotokoll erhalte ich die folgende Ausgabe [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.

Antworten

MrWhite Jul 07 2020 at 00:04

Wenn Sie diese Anweisungen direkt in den Container einfügen möchten VirtualHost(dh nicht in einen <Directory>Container), können Sie sie folgendermaßen umschreiben:

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]

Erforderliche Änderungen:

  • Wenn die vhost-Anweisungen verarbeitet werden, wurde die Anforderung noch nicht dem Dateisystem zugeordnet. Daher muss ein Look-Ahead ( LA-U:REQUEST_FILENANE) verwendet werden, um den resultierenden Dateinamen abzurufen.

  • In einem VirtualHost-Kontext ist der vom RewriteRule Muster übereinstimmende URL-Pfad root-relativ und beginnt mit einem Schrägstrich. Anstelle von .in .htaccesbenötigen Sie also /.(oder ^/.) in der vhost-Konfiguration.

  • Die RewriteBaseDirektive gilt nicht im Kontext von virtualhost und muss daher entfernt werden. (Obwohl Sie dies in Ihrer vorhandenen .htaccessDatei sowieso nicht verwendet haben .)

Zusätzlich:

  • In der Direktive, die die HTTP_AUTHORIZATIONUmgebungsvariable festlegt, ist das Muster .* weniger effizient. Besser zu verwenden ^(oder ähnlich - etwas, das nicht den gesamten URL-Pfad durchlaufen muss)

  • Ihr anfänglicher <IfModule>Wrapper ist bedeutungslos.