Apache 配置 - 所有虚拟主机的重写规则

Apache 配置 - 所有虚拟主机的重写规则

我的 Apache 上有 2 个虚拟主机,配置如下:www.域名.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”)可以从所有虚拟主机自由访问(无需身份验证),而无需复制代码。

文件夹:

   /网站
     /万维网
       /图片
       /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/... 仍然受到基本身份验证的限制。

答案1

满足。您的具体需求详见需要文档也一样。

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

然后,您需要在 res.domain.com 虚拟主机上复制任何重写规则。如果您希望从中传递相同的内容,res.domain.com您可能需要别名res.domain.com/api目录的路径/website/www/api

答案2

我得到了它!

重写库缺失。尽管在第一个域的配置中它不是强制性的,但在第二个域中它是强制性的!

我还设法使其适用于在服务器级别移动“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 的触发;)

相关内容