这是我之前的一个后续问题问题在这个网站上。也许我应该指出,Apache 服务器是在 Windows 系统上运行的,不知道这是否重要。
我的问题如下:
我有 2 个驱动器 J: 和 K:,都有一个目录测试(J:/测试/和凯:/测试/)
J:/测试/包含文件粉红色.html
凯:/测试/包含文件红色.html和蓝色.html
我想要访问J:/测试/和凯:/测试/使用相同的 URL:
这是我的 httpd.conf 文件的摘录:
Alias /test/ "J:/test/"
Alias /test2/ "K:/test/"
<Directory "J:/test/">
Order allow,deny
Allow from all
Options All MultiViews
AllowOverride None
RewriteEngine on
RewriteCond /test/%(REQUEST_FILENAME) !-f #if we can't find the file in /test/
RewriteRule ^(.+) /test2/$1 [L] #rewrite url into /test2/something.html
RewriteCond /test/%(REQUEST_FILENAME) -f #if we find the file in /test/
RewriteRule ^(.+) /test/$1 #should this even be necessary ?
</Directory>
这只起到了部分作用,我可以访问 K: 驱动器上的 red.html 和 blue.html,但无法访问 J: 驱动器上的 pink.html。它似乎完全忽略了第二RewriteCond-RewriteRule
对。如何配置 httpd.conf 来访问 pink.html?
我尝试了几种方法,但都没用 :-( 我希望我的问题清楚,并且有人可以对这个问题作出解释。
提前谢谢!/亚历克斯
答案1
尝试这个,
RewriteRule ^(.+) /test/$1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/test/(.+) /test2/$1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/test2/(.+) /test3/$1
...
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/test1E+10/(.+) http://www.google.com/search?q=where-is-$1 [L]
答案2
在 Linux 下,您可以在文件系统级别执行此操作,因为有多个文件系统支持以这种方式联合其他文件系统(即使在读+写模式下),但我认为在 Windows 中没有办法这样做。
另一个选项(同样在操作系统级别而非 Apache 级别)可能是将所有文件作为符号链接放在一个位置。如果您使用 NTFS 文件系统,则在 Windows 下可以使用以下实用程序这是来自 SysInternals 的。
答案3
您不需要第二个 RewriteCond/Rule 组合,因为基本上您是在试图告诉 Apache 做它本来会做的事情。基本上,如果在请求的位置 (/test/pink.html) 找到文件,则默认操作是将其提供给客户端。
我会将这些 Rewrite* 移出目录构造;该容器通常用于访问限制,而您所做的是逻辑重定向。将 Rewrite* 移出并删除第二节后,编辑 RewriteCond 以使用 {} 而不是 () 字符,因为这是适当的方法。
如果完成所有这些操作后它仍然不起作用,请添加以下两行:
RewriteLog "c:/rwlog.txt"
RewriteLogLevel 7
...重新启动 Apache,测试并读取日志文件以找出接下来 Apache 不喜欢什么。