Apache mod_rewrite让我发疯

时间:2010-04-08 14:50:59

标签: apache mod-rewrite

场景

我有一个在多个站点之间共享的webhost,目录布局如下所示:

siteA/
    - css/
    - js/
    - index.php
siteB/
    - css/
    - js/
    - index.php
siteC/
    .
    .
    .

DocumentRoot位于顶层,因此,要访问siteA,请在浏览器中键入http://webhost/siteA,要访问siteB,请键入http://webhost/siteB, 等等。

现在我必须部署我自己的网站,其设计考虑了3个VirtualHosts,所以我的结构如下:

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或类似内容。 请帮忙:(

1 个答案:

答案 0 :(得分:1)

这很奇怪,但您可以在最后一个模式中添加其他条件,即如果与之前的模式不匹配则使用它:

RewriteCond %{REQUEST_URI} !^/siteD/static/(.*)$ [NC]
RewriteCond %{REQUEST_URI} !^/siteD/admin/(.*)$ [NC]
RewriteRule ^siteD/(.*)$ siteD/sites/public/htdocs/index.php [L,QSA]