Apache-2.4

將 .htaccess 中的規則重寫為 Apache VirtualHost

  • July 6, 2020

我有以下.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>的包裝是沒有意義的。

引用自:https://serverfault.com/questions/1024226