【发布时间】:2010-04-08 14:50:59
【问题描述】:
场景
我有一个在多个站点之间共享的虚拟主机,目录布局如下所示:
siteA/
- css/
- js/
- index.php
siteB/
- css/
- js/
- index.php
siteC/
.
.
.
DocumentRoot 位于顶层,因此,要访问站点 A,请在浏览器中键入 http://webhost/siteA,要访问站点 B,请键入 http://webhost/siteB, 等等。
现在我必须部署自己的站点,该站点的设计考虑了 3 个虚拟主机,因此我的结构如下所示:
siteD/
- sites/sitename.com/
- log/
- htdocs/
- index.php
- sites/static.sitename.com
- log/
- htdocs/
- css
- js
- sites/admin.sitename.com
- log/
- htdocs/
- index.php
如您所见,问题在于我的 index.php 文件不在顶级目录中,这与 webhost 上已经存在的站点不同。 每个 VirtualHost 都应该指向对应的 htdocs/ 文件夹:
http://siteD.com -> siteD/sites/sitename.com/htdocs
http://static.siteD.com -> siteD/sites/static.sitename.com/htdocs
http://admin.siteD.com -> siteD/sites/admin.sitename.com/htdocs
问题
我不能在这个主机上拥有 VirtualHosts,所以我必须以某种方式模拟它,可能使用 mod_rewrite。
想法
在网站上的所有链接中都有一些预定义的部分,我可以识别它们,并使用 mod_rewrite 相应地路由到正确的文件。
例子:
http://webhost/siteD/static/js/something.js -> siteD/sites/static.sitename.com/htdocs/js/something.js
http://webhost/siteD/static/css/something.css -> siteD/sites/static.sitename.com/htdocs/css/something.css
http://webhost/siteD/admin/something -> siteD/sites/admin.sitename.com/htdocs/index.php
http://webhost/siteD/admin/sub/something -> siteD/sites/admin.sitename.com/htdocs/index.php
http://webhost/siteD/something -> siteD/sites/sitename.com/htdocs/index.php
http://webhost/siteD/sub/something -> siteD/sites/sitename.com/htdocs/index.php
以http://url/sitename/admin/(.*) 开头的任何内容都将被重写,以指向 siteD/sites/admin.sitename.com/htdocs/index.php
以http://url/sitename/static/(.*) 开头的任何内容都将被重写,以指向 siteD/sites/static.sitename.com/htdocs/$1
以http://url/sitename/(.*) AND 开头的任何内容都没有从上面匹配,将被重写为指向 siteD/sites/sitename.com/htdocs/index.php
解决办法
这是我想出的 .htaccess 文件:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/siteD/static/(.*)$ [NC]
RewriteRule ^siteD/static/(.*)$ siteD/sites/static/htdocs/$1 [L]
RewriteCond %{REQUEST_URI} ^/siteD/admin/(.*)$ [NC]
RewriteRule ^siteD/(.*)$ siteD/sites/admin/htdocs/index.php [L,QSA]
到目前为止,一切都很好。一切正常。现在添加最后一条规则:
RewriteCond %{REQUEST_URI} ^/siteD/(.*)$ [NC]
RewriteRule ^siteD/(.*)$ siteD/sites/public/htdocs/index.php [L,QSA]
而且它坏了。最后一条规则捕获所有内容,即使是其中包含 static/ 或 admin/ 的内容。 为什么? [L] 标志不应该在前两种情况下停止重写过程吗?为什么要评估第三种情况?
有没有更好的方法来解决这个问题?我不坚持 rewritemod,只要它不需要访问服务器级配置,一切都很好。
我无权访问 RewriteLog 或类似的东西。 请帮忙:(
【问题讨论】:
标签: apache mod-rewrite