假设有以下文件夹:
/
index.html
/folder1/
index.html
page.html
(因此,root 带有 index.html 而 folder1 带有 index.html 和 page.html。)
我想要 page.html 中指向“/”的链接链接到/folder1/index.html。
另外,例如,在 PHP 中,如果我include('/file.php');
,它应该从而/folder1/
不是 root 中获取。
基本上,folder1 内的任何文件都被/
视为/folder1/
。
我尝试RewriteBase /folder1/
过,.htaccess
但是没有用。
请问该如何做呢?
答案1
这是您正在尝试执行的操作所存在的问题:
- 客户请求
/folder1/index.html
,其中包括指向 的链接/file.php
。 - 客户端发出请求
/file.php
。此时,服务器不知道这个请求来自位于/folder1
,因此没有任何重写魔法可以使其工作。
以下是一些可能的解决方案:
<VirtualHost>
您可以在配置中设置多个块,每个块具有不同的DocumentRoot
。这要求您控制 DNS 或控制hosts
访问服务器的所有客户端的文件。例如,您可以在服务器配置中执行如下操作:
<VirtualHost *:80> ServerName server1 DocumentRoot /var/www/server1/html </VirtualHost> <VirtualHost *:80> ServerName server2 DocumentRoot /var/www/server2/html </VirtualHost>
每个虚拟主机指向不同的文件夹,因此如果您请求
http://server1/
,所有链接都将解析为 内的文档/var/www/server1/html
,对于 也是如此server2
。正如我所提到的,这假定您可以为客户端在 DNS 中创建server1
和server2
显示,或者您可以将以下内容添加到客户端主机文件:your.server.ip server1 server2
既然您说过“这是本地主机,我可以更改任何内容”,那么这似乎是最简单、最有效的解决方案。
您可以研究使用 Apache 输出过滤器来重写文档中的所有链接。也就是说,如果有人请求
/folder1/index.php
,Apache 会重写看起来像/file.php
的链接/folder1.php
。一般来说,对于这种事情,我建议mod_proxy_html,但我不完全确定这是否可以在代理设置之外运行。如果mod_proxy_html不起作用,你可以尝试使用mod_sed。对于 Apache 2.4 之前的版本,您可能必须单独构建它,而且要正确构建它会更加棘手。
我推荐
VirtualHost
基于的解决方案。