Apache-2.2

Apache 配置 - 所有虛擬主機的重寫規則

  • August 19, 2013

我的 Apache 上有 2 個虛擬主機的以下配置:www.domain.comres.domain.com。第一個是開放的,第二個僅限於註冊使用者。

<VirtualHost *:80>
  ServerName www.domain.com
  DocumentRoot /website/www
  <Directory "/website/www">
     Options FollowSymLinks
     AllowOverride All
     RewriteEngine On  
     RewriteCond %{REQUEST_URI} !api/dispatch\.php$
     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteRule ^api/.*$ api/dispatch.php [L,QSA]
  </Directory>
</VirtualHost>

<VirtualHost *:80>
  ServerName res.domain.com
  DocumentRoot /website/res
  <Directory "/website/res">
     Options FollowSymLinks
     AllowOverride All
     AuthType        Basic
     AuthUserFile    /website/res/users.sec
     <Limit GET POST>
        Require         valid-user
     </Limit>
  </Directory>
</VirtualHost>

我想為所有呼叫http://res.domain.com/api/ * 提供服務,就像它們是http://www.domain.com/api/ * 一樣。沒有身份驗證和相同的行為……

重要提示:我不希望我的使用者看到重定向…

我需要幫助,因為我嘗試了很多東西但沒有成功。

編輯 1 這裡的想法是讓網站的一部分(在這種情況下為“api”)可以從所有虛擬主機自由訪問(= 無需身份驗證),而無需複制程式碼。

文件夾:

/網站
/全球資訊網
/img
/api
/css
/...
/res
/...

我嘗試過結合 Alias、RewriteRule 和 Directory… 例如:

<VirtualHost *:80>
  ServerName www.domain.com
  DocumentRoot /website/www
  <Directory "/website/www">
     Options FollowSymLinks
     AllowOverride All
     RewriteEngine On  
     RewriteCond %{REQUEST_URI} !api/dispatch\.php$
     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteRule ^api/.*$ api/dispatch.php [L,QSA]
  </Directory>
</VirtualHost>

<VirtualHost *:80>
  ServerName res.domain.com
  DocumentRoot /website/res
  Alias /api /website/www/api
  <Directory "/website/www/api">
     Options FollowSymLinks
     AllowOverride All
     Satisfy Any
     Allow from all

     RewriteEngine On  
     RewriteCond %{REQUEST_URI} !dispatch\.php$
     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteRule ^.*$ dispatch.php [L,QSA]
  </Directory>
  <Directory "/website/res">
     Options FollowSymLinks
     AllowOverride All
     AuthType        Basic
     AuthUserFile    /website/res/users.sec
     <Limit GET POST>
        Require         valid-user
     </Limit>
  </Directory>
</VirtualHost>

在這種情況下,對http://res.domain.com/api/ … 的呼叫仍然受到基本身份驗證的限制。

我得到了它!

缺少RewriteBase。儘管在第一個域的配置中不是強制性的,但在第二種情況下是必須的!

我還設法使其適用於在伺服器級別移動“api”目錄配置的任何虛擬主機。它給:

# API Accessible from all domains
Alias /api /website/www/api
<Directory "/website/www/api">
  Options FollowSymLinks
  AllowOverride None
  Satisfy Any
  Allow from all

  RewriteEngine On
  RewriteBase /api/
  RewriteCond %{REQUEST_URI} !dispatch\.php$
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^.*$ dispatch.php [L,QSA]
</Directory>

# Virtual hosts
<VirtualHost *:80>
  ServerName www.domain.com
  DocumentRoot /website/www
  <Directory "/website/www">
     Options FollowSymLinks
     AllowOverride All
     Order allow,deny
     Allow from all 
  </Directory>
</VirtualHost>

<VirtualHost *:80>
  ServerName res.domain.com
  DocumentRoot /website/res
  <Directory "/website/res">
     Options FollowSymLinks
     AllowOverride All
     AuthType        Basic
     AuthUserFile    /website/res/users.sec
     <Limit GET POST>
        Require         valid-user
     </Limit>
  </Directory>
</VirtualHost>

感謝@mindthemonkey 的觸發器;)

滿足Require 文件中也詳細說明了您的特定需求。

  <Directory "/website/res/api">
     Satisfy Any
     Allow from all
  </Directory>

然後,您將需要在 res.domain.com 虛擬主機上複製任何重寫規則。如果您希望從中傳遞相同的內容,res.domain.com您可能需要為您的目錄的路徑設置別名。res.domain.com/api``/website/www/api

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