我们有https://example1.com/login和example2.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.com和example2.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>它禁用
/loginexample1.com和example2.com。
我很好奇…这似乎允许所有访问,不否认? Deny from ...指令拒绝从example1.com (通过在远程IP地址上进行反向DNS查找)访问用户,而不是访问example1.com主机的用户。 Deny或Allow指令都不应该匹配,所以它应该默认允许 。 (?)
如何为同一个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_HOST为example1.com 且 URL为/login 或 /demo 或 /test所有URL,则提供404错误文档。 然而,第一个例子(使用RewriteRule 模式 )会更有效率,因为这是首先处理的。