我们有https://example1.com/login
和example2.com/login
托管在同一个 Apache 服务器 (2.2.22) 上。我想/login
限制example1.com
。
example1.com/login
--> 404(最好)或 403example2.com/login
--> 登录页面
我试过
<Location /login>
Order Deny,Allow
Deny from example1.com
Allow from example2.com
</Location>
它会禁用/login
和。我可以只限制吗example1.com
?example2.com
example1.com
答案1
您可以使用 mod_rewrite 来执行此操作,它允许您检查主持人<Directory>
访问网站时所使用的服务器配置。请在服务器配置(或部分或.htaccess
文件)中尝试以下操作:
RewriteEngine On
RewriteCond %{HTTP_HOST} =example1.com [NC]
RewriteRule ^/?login$ - [R=404,L]
如果您请求,则上述代码会返回 404 Not Found example1.com/login
,但如果您请求,则不会执行任何操作example2.com/login
(只是允许请求通过)。
=
上的前缀RewriteCond
条件模式使其成为精确的字典顺序比较,而不是正则表达式,因此无需转义点或使用锚点。
为了提供 403 Forbidden,您可以更改 上的标志RewriteRule
,例如:
RewriteRule ^/?login$ - [F]
<Location /login> Order Deny,Allow Deny from example1.com Allow from example2.com </Location>
它禁用
/login
和example1.com
。example2.com
我很好奇……这似乎允许所有访问,而不是拒绝它?该Deny from ...
指令拒绝来自(通过对远程 IP 地址进行反向 DNS 查找)的用户的访问example1.com
,而不是访问主机的用户example1.com
。Deny
或Allow
指令都不应匹配,因此它应该是默认的允许。 (?)
...如何为同一个 RewriteCond 添加多个重写条件?
更新:请注意RewriteCond
指令(即。状况)适用于RewriteRule
后面的单个指令。继续上面的例子,如果您希望仅阻止多个 URL(例如/login
,/demo
和/test
),example1.com
那么您可以将所有这些组合在RewriteRule
图案。 例如:
RewriteCond %{HTTP_HOST} =example1.com [NC]
RewriteRule ^/?(login|demo|test)$ - [R=404,L]
在这种情况下,这是可以的,因为 URL 有限且都很短。或者,您可以为每个 URL 创建一个条件并使用标志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]
这表示...对于所有 URL,HTTP_HOST
其中example1.com
和URL 可以是/login
或者 /demo
或者 /test
然后提供 404 错误文档。但是,第一个示例(使用RewriteRule
图案) 会更有效率,因为这是首先处理的。