【问题标题】:Apache mod_rewrite driving me madApache mod_rewrite 让我发疯
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 好主意,不幸的是它不起作用,第三条规则仍然可以解决所有问题。我开始认为问题可能出在其他地方......
    猜你喜欢
    • 2012-01-14
    • 2011-05-30
    • 2012-11-02
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多