重写/限制在Apache中的特定域名

我们有https://example1.com/loginexample2.com/login从同一个Apache服务器(2.2.22)托pipe。 我想限制/login example1.com

  • example1.com/login – > 404(最好)或403

  • example2.com/login – >login页面

我试过了

 <Location /login> Order Deny,Allow Deny from example1.com Allow from example2.com </Location> 

它禁用/login example1.comexample2.com 。 我可以限制example1.com吗?

你可以使用mod_rewrite来做到这一点,它允许你检查站点被访问的主机 。 在您的服务器configuration(或<Directory>部分或.htaccess文件)中尝试以下操作:

 RewriteEngine On RewriteCond %{HTTP_HOST} =example1.com [NC] RewriteRule ^/?login$ - [R=404,L] 

如果您请求example1.com/login ,上面提供了404 Not Found,但是如果您请求example2.com/login (请求将被允许通过),将不会执行任何操作。

RewriteCond CondPattern=前缀使得它成为精确的字典对比,而不是正则expression式,所以不需要转义点或使用锚点

为了提供403 Forbidden,你可以改变RewriteRule上的标志,例如:

 RewriteRule ^/?login$ - [F] 

 <Location /login> Order Deny,Allow Deny from example1.com Allow from example2.com </Location> 

它禁用/login example1.comexample2.com

我很好奇…这似乎允许所有访问,不否认? Deny from ...指令拒绝从example1.com (通过在远程IP地址上进行反向DNS查找)访问用户,而不是访问example1.com主机的用户。 DenyAllow指令都不应该匹配,所以它应该默认允许 。 (?)


如何为同一个RewriteCond添加多个重写条件?

更新:请注意, RewriteCond指令(即条件 )适用于下面的单个RewriteRule指令。 继续上面的例子,如果你想阻止example1.com几个URL(例如./login,/ /demo/test ),那么你可以把所有这些以RewriteRule 模式结合起来。 例如:

 RewriteCond %{HTTP_HOST} =example1.com [NC] RewriteRule ^/?(login|demo|test)$ - [R=404,L] 

在这种情况下,这是可以的,因为URL是有限的,并且都很短。 或者,您可以为每个URL创build条件并使用OR标志。 例如:

 RewriteCond %{HTTP_HOST} =example1.com [NC] RewriteCond %{REQUEST_URI} ^/login$ [OR] RewriteCond %{REQUEST_URI} ^/demo$ [OR] RewriteCond %{REQUEST_URI} ^/test$ RewriteRule ^ - [R=404,L] 

这说明…对于HTTP_HOSTexample1.com URL为/login /demo /test所有URL,则提供404错误文档。 然而,第一个例子(使用RewriteRule 模式 )会更有效率,因为这是首先处理的。