我有以下.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>
包装毫无意义。