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

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

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

所以,我们到目前为止(从这篇文章如何重写根文件,如果文件存在于文件夹? )是:

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

这在一定程度上起作用,但是似乎将所有内容都指向了传统文件夹,而不仅仅是当文件不存在于第一个位置并且存在于传统文件夹中时。

杰克,先谢谢你的帮助

在您的草稿中,第一个RewriteCond会检查网页是否存在于根目录中,但是不检查网页是否存在于备用文件夹中,因此太多的redirect。 (第二个RewriteCond显然是某种反循环检查[这是不工作,因为这是一个内部redirect而不是外部redirect]或某种直接访问替代目录[这取决于您的使用可能甚至不是一个好主意])。

这样一个简单的状态似乎令人惊讶地实施复杂。 我能find的最好的(希望别人会更清楚)是:

 # 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] 

(请注意,这不仅仅是解决你所陈述的问题,它还试图变得更加通用:在所有子目录中工作,甚至在斜杠加倍的情况下工作,并且在不同的Apach上工作,并且configuration有细微的不同。