mod_rewrite 初学者

mod_rewrite 初学者

我有以下目录结构:

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 方式访问此子目录之外的任何文件,那么您将需要添加其他状况对于每个问题,或者使用全面的文件系统检查。但是,由于您之前已经通过更改文档根目录在其他系统上解决了这个问题,因此这似乎不是问题。

相关内容