![.htaccess - 模拟虚拟主机在目录列表中错误链接到父目录](https://linux22.com/image/603950/.htaccess%20-%20%E6%A8%A1%E6%8B%9F%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA%E5%9C%A8%E7%9B%AE%E5%BD%95%E5%88%97%E8%A1%A8%E4%B8%AD%E9%94%99%E8%AF%AF%E9%93%BE%E6%8E%A5%E5%88%B0%E7%88%B6%E7%9B%AE%E5%BD%95.png)
我有一个专用于本地服务器的域名 (.dev),以及一个 .htaccess 文件,该文件将请求重定向到http://folder.dev/subfolder/
。/htdocs/folder/subfolder
除了一个小问题外,它运行良好。当我启用目录列表时,我可以正常访问所有文件夹、子文件夹和文件,但当我单击链接时除外Parent Directory
,例如,该链接应该指向http://folder.dev
,但重定向到http://folder.dev/folder/
并因此引发404 not found
。同样,如果Parent Directory
应该链接到http://folder.dev/subfolder/
,它链接到http://folder.dev/folder/subfolder/
。我的 .htaccess 如下所示:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
RewriteCond %{ENV:REDIRECT_SUBDOMAIN} =""
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9][-a-z0-9]+)\.dev\.?(:80)?$ [NC]
RewriteCond %2 !^www|ftp|mail|pop3|localhost$
RewriteCond %{DOCUMENT_ROOT}/%2 -d
RewriteRule ^(.*) %2/$1 [E=SUBDOMAIN:%2,L]
RewriteRule ^ - [E=SUBDOMAIN:%{ENV:REDIRECT_SUBDOMAIN}]
除此以外,其他一切都正常(例如文档中的相对链接等)
答案1
发生这种情况的原因是,当 Apache 显示目录索引时,它会根据虚拟主机的 DocumentRoot 和当前目录来评估“父目录”链接。
我猜您使用/htdocs
目录作为文档根目录folder1.dev
,folder2.dev
以及所有其他 .dev 域的文档根目录,并且将 .htaccess 放在其中/htdocs/.htaccess
。
当您转到http://folder.dev/subfolder/
(文档根目录为/htdocs/
)时,.htaccess 会显示/htdocs/folder/subfolder/
。从文档根目录到此目录的相对路径为folder/subfolder
。当 Apache 计算当前显示的目录的父目录链接时,它会取http://
++ folder.dev
,dirname('folder/subfolder')
也就是说,当然,等于http://folder.dev/folder/
,而不是http://folder.dev/
您所期望的那样。
可以在 .htaccess 中检查域名后的第一个路径元素是否等于子域名,然后重定向到根目录:
- 我们有
http://folder.dev/folder/
。 - 我们看到“文件夹”(子域)==“文件夹”(第一个路径元素)。
- 重定向到
http://folder.dev/
。
但是如果这样做,就无法访问类似的路径/htdocs/folder/folder/
,其中第一个路径元素确实与子域名相同。
鉴于此,您不能仅使用 .htaccess 和 mod_rewrite 来解决此问题。
另一种解决方案:
- 对您想要访问的任何文件夹使用虚拟主机。无需 .htaccess magic。可以从文件夹列表生成虚拟主机配置。最灵活的解决方案,因为可以使用任何配置选项为任何文件夹创建任何虚拟主机,无论它们位于何处。
- 使用mod_vhost_alias。更简单,不需要脚本技能,但可能需要更改文件夹命名以实现 folder_name 和 document_root 之间的自动转换。
- 使用标头名称在 .htaccess 中将标题添加到所有索引页。使用 jQuery 以任何您想要的方式更改父目录链接。看起来像一个肮脏的黑客,但可以工作。