将 .htaccess 中的重写规则写入 Apache VirtualHost

将 .htaccess 中的重写规则写入 Apache VirtualHost

我有以下.htaccess文件:

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

是否可以将上述规则转换为可用的VirtualHost块?

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

但是在 apache 错误日志中,我得到以下输出 [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.

答案1

如果您想将这些指令直接放入其中VirtualHost(即不在<Directory>容器内),那么您可以像这样重写它们:

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]

所需更改:

  • 当处理 vhost 指令时,请求尚未映射到文件系统,因此需要使用前瞻 ( LA-U:REQUEST_FILENANE) 来获取生成的文件名。

  • 在虚拟主机上下文中,RewriteRule 图案是相对于根目录的,以斜杠开头。因此,在 vhost 配置中,您需要的是(或),而.不是。.htacces/.^/.

  • RewriteBase指令不适用于虚拟主机上下文,因此需要删除。(尽管您在现有文件中没有使用它.htaccess。)

额外的:

  • 在设置环境变量的指令中HTTP_AUTHORIZATION图案 .*效率较低。最好使用^(或类似的东西 - 不需要遍历整个 URL 路径的东西)

  • 您的初始<IfModule>包装毫无意义。

相关内容