情况:
- 当从 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>