从一个域访问文件夹时返回 404 页面,但允许从其他域和 IP 地址访问

从一个域访问文件夹时返回 404 页面,但允许从其他域和 IP 地址访问

情况:

  • 当从 example.com 域访问文件夹(“隐藏”)时,我想返回 404 页面(“404.php”)。
  • 我希望可以从子域(“hidden.example.com”)或不同的域(“hidden.com”)访问同一个文件夹,这两个域都在单个 VirtualHost 条目中配置。
  • 该服务器有多个 IP 地址可供监听。每个 IP 地址都提供来自 example.com 域的相同内容(共享 VirtualHost 条目)。我希望可以从 IP 地址访问该文件夹。
  • 服务器配置为使用 SSL/TLS/HTTPS。HTTPS 在 example.com 上是可选的,但使用如下所示的重写规则在隐藏文件夹的 .htaccess 文件中强制使用 HTTPS。

/www/hidden/.htaccess

RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

我知道 {SERVER_ADDR} 提供了服务器的 IP 地址,但是它是否返回客户端请求的 IP 地址?

我也开始认为 VirtualHosts 文件中的某些内容更合适。对此有什么看法?

应该允许什么:

http://87.65.43.21/hidden/
https://87.65.43.21/hidden/
http://12.34.56.78/hidden/
https://12.34.56.78/hidden/
http://hidden.example.com/
https://hidden.example.com/
http://hidden.com/
https://hidden.com/
http://www.hidden.com/
https://www.hidden.com/

404.php 应该如何实现 404

http://example.com/hidden/
https://example.com/hidden/
http://www.example.com/hidden/
https://www.example.com/hidden/
http://example.com/hidden/hiddenfile.php
https://example.com/hidden/hiddenfile.php
etc.

谢谢。

答案1

你可以通过在 .htaccess 中添加一些 mod_rewrite 魔法来实现这一点

RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule .* http://www.example.com/404.php [R=301]
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

这只是一个如何做到这一点的例子,当然您可以更改规则的顺序和它们的目标,只要记住添加将[L]阻止 mod_rewrite 评估任何进一步的规则。

答案2

只要 example.com 的 DocumentRoot 不是 /www,而是 /www/something_else,此方法就可行。将以下内容添加到 httpd.conf:

NameVirtualHost 87.65.43.21
NameVirtualHost 12.34.56.78
NameVirtualHost hidden.com
NameVirtualHost hidden.example.com

<VirtualHost 12.34.56.78 12.34.56.78 hidden.com hidden.example.com>
    DocumentRooot /www/hidden
    ServerName hidden.com
    ServerAlias hidden
</VirtualHost>

相关内容