Apache-2.4
將 .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.
如果您想將這些指令直接放入
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
模式匹配的 URL 路徑是相對於根的,以斜杠開頭。因此,您需要(或)在 vhost 配置中,而不是.
in 。.htacces``/.``^/.
- 該
RewriteBase
指令不適用於虛擬主機上下文,因此需要刪除。(儘管您在現有.htaccess
文件中並沒有使用它。)額外的:
- 在設置
HTTP_AUTHORIZATION
環境變數的指令中,模式.*
效率較低。更好地使用^
(或類似的 - 不必遍歷整個 URL 路徑的東西)- 你最初
<IfModule>
的包裝是沒有意義的。