我有以下目录结构:
site
lib
versions
/1.0
/application
/library
/public
我的网站根目录是example.com
。
我希望所有请求都example.com
重定向到example.com/versions/1.0/public
,同时保留请求 URL 为example.com
。
我的服务器在 Dreamhost 上,我只需将我的站点根目录指向公共文件夹,但我当前客户的主机不提供此功能。实现此目的的最佳方法是什么?
另外,由于我正在使用 ZendFramework,该public
文件夹包含一个.htaccess
文件,其中包含我希望避免与之冲突的以下规则。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
答案1
将其添加到您的根目录应该会产生预期的效果,尽管可能有更优雅的方式来做到这一点:
RewriteCond %{REQUEST_URI} !^/public [NC]
RewriteCond %{REQUEST_URI} !^/library [NC]
RewriteCond %{REQUEST_URI} !^/application [NC]
RewriteCond %{REQUEST_URI} !^/site [NC]
RewriteCond %{REQUEST_URI} !^/lib [NC]
RewriteRule ^(.*)$ /versions/1.0/public/$1
答案2
.htaccess
由于您在要重写的位置有一个使用 mod_rewrite 的文件,因此您可以简单地在根.htaccess
文件中无条件重写所有内容:
RewriteEngine On
RewriteRule (.*) /versions/1.0/public/$1 [L]
一旦发生重写,.htaccess
子目录中的文件将接管。无需额外的状况是必需的。无重写循环。
当然,如果您需要以 HTTP 方式访问此子目录之外的任何文件,那么您将需要添加其他状况对于每个问题,或者使用全面的文件系统检查。但是,由于您之前已经通过更改文档根目录在其他系统上解决了这个问题,因此这似乎不是问题。