在 apache 中重写/限制特定域名

在 apache 中重写/限制特定域名

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

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

  • example2.com/login--> 登录页面

我试过

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

它会禁用/login和。我可以只限制吗example1.comexample2.comexample1.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>

它禁用/loginexample1.comexample2.com

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


...如何为同一个 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 图案) 会更有效率,因为这是首先处理的。

相关内容