.htaccess - 模拟虚拟主机在目录列表中错误链接到父目录

.htaccess - 模拟虚拟主机在目录列表中错误链接到父目录

我有一个专用于本地服务器的域名 (.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.devfolder2.dev以及所有其他 .dev 域的文档根目录,并且将 .htaccess 放在其中/htdocs/.htaccess

当您转到http://folder.dev/subfolder/(文档根目录为/htdocs/)时,.htaccess 会显示/htdocs/folder/subfolder/。从文档根目录到此目录的相对路径为folder/subfolder。当 Apache 计算当前显示的目录的父目录链接时,它会取http://++ folder.devdirname('folder/subfolder')也就是说,当然,等于http://folder.dev/folder/,而不是http://folder.dev/您所期望的那样。

可以在 .htaccess 中检查域名后的第一个路径元素是否等于子域名,然后重定向到根目录:

  1. 我们有http://folder.dev/folder/
  2. 我们看到“文件夹”(子域)==“文件夹”(第一个路径元素)。
  3. 重定向到http://folder.dev/

但是如果这样做,就无法访​​问类似的路径/htdocs/folder/folder/,其中第一个路径元素确实与子域名相同。

鉴于此,您不能仅使用 .htaccess 和 mod_rewrite 来解决此问题。

另一种解决方案:

  1. 对您想要访问的任何文件夹使用虚拟主机。无需 .htaccess magic。可以从文件夹列表生成虚拟主机配置。最灵活的解决方案,因为可以使用任何配置选项为任何文件夹创建任何虚拟主机,无论它们位于何处。
  2. 使用mod_vhost_alias。更简单,不需要脚本技能,但可能需要更改文件夹命名以实现 folder_name 和 document_root 之间的自动转换。
  3. 使用标头名称在 .htaccess 中将标题添加到所有索引页。使用 jQuery 以任何您想要的方式更改父目录链接。看起来像一个肮脏的黑客,但可以工作。

相关内容