如果文件存在于另一个文件夹中,如何使用 htaccess 重写?

如果文件存在于另一个文件夹中,如何使用 htaccess 重写?

如果文件不存在于文档根目录中,但存在于其他文件夹中,我们将尝试重写到另一个文件夹。

另一个文件夹位于完全不同的位置,使用虚拟主机中的“别名”进行定位。

那么,到目前为止我们所拥有的(来自这篇文章)如果文件夹中存在文件,如何从根目录重写 URI?) 是:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/legacy/
RewriteRule ^(.*)$ legacy/$1 [QSA,L]

这在一定程度上有效,但似乎将所有内容都导向旧文件夹,而不仅仅是当文件在第一个位置不存在而存在于旧文件夹中时。

提前感谢你的帮助,杰克。

答案1

在您的草稿中,第一个 RewriteCond 检查网页是否存在于根目录中,但没有检查网页是否存在于备用文件夹中,因此重定向过多。(第二个 RewriteCond 显然是某种反循环检查 [这不起作用,因为这是内部重定向而不是外部重定向] 或某种对备用目录的直接访问 [根据您的使用情况,这可能甚至不是一个好主意])。

这么简单的事情说起来似乎执行起来非常复杂。我能找到的最好的解释(希望其他人能更了解)是:

# parse the current local filename into parts we can manipulate
# (weird construct and regex in first RewriteCond are because 
#  mod_rewrite never does any variable substitution on the righthand side)
RewriteCond %{DOCUMENT_ROOT},%{REQUEST_FILENAME} ^([^,]*),\1/*(.*)/+(.*)$
RewriteRule ^ - [E=CURPATH:/%2,E=CURNAME:%3]

# allow direct access to the alternate folder
#  (omit this entire ruleset if that's not desired)
RewriteCond %{ENV:CURPATH} !^/*legacy(?:/|$)
RewriteRule ^ - [L]

# do the checks and make the change if necessary
RewriteCond %{DOCUMENT_ROOT}/%{ENV:CURPATH}/%{ENV:CURNAME} !-f
RewriteCond %{DOCUMENT_ROOT}/legacy/%{ENV:CURPATH}/%{ENV:CURNAME} -f
RewriteRule ^ /legacy/%{ENV:CURPATH}/%{ENV:CURNAME} [L]

(请注意,这不仅仅是针对您所陈述的问题的解决方案。它还试图变得更加通用:在所有子目录中工作,即使斜杠加倍也能工作,并且在具有细微不同配置的不同 Apache 上工作。)

相关内容