【问题标题】:mod_alias and mod_rewrite don't work togethermod_alias 和 mod_rewrite 不能一起工作
【发布时间】:2012-06-01 21:40:08
【问题描述】:

我知道这里有很多类似的问题,但不幸的是,它们都没有解决我遇到的问题。我正在尝试弄清楚为什么当您也有别名时重写规则不起作用,下面是对导致问题的情况的解释。

我有许多 Zend Framework 应用程序,我想将它们包含在同一个子域中,因为我可以使用的子域有限,而且我想为我作为演示/教程所做的所有项目创建一个站点,所以有意义将它们全部放在一个地方。与许多 Web 应用程序/MVC 解决方案一样,Zend 框架旨在让每个应用程序都位于其自己的域或子域中。因此,我正在寻找一种解决方案,使文件夹成为站点/Web 应用程序,就像它是子域一样。这就是我目前所拥有的。

我在以下位置为演示设置了子域:C:/Apache2/htdocs/demos,其中有一个公用文件夹作为文档根目录(zend 框架使用公用文件夹作为文档根目录,上面有其他文件夹,如应用程序使应用程序工作;这是出于安全原因,以防止用户访问他们不应该访问的文件)。我也有 C:/Apache2/htdocs/zf-basic-project 用于我想要作为 demos.example.com 子域中的文件夹的应用程序(同样它有一个公共文件夹作为文档根目录)。

演示子域的虚拟主机如下所示:

<VirtualHost *:80>
    ServerName demos.example.com
    DocumentRoot "C:/Apache2/htdocs/demos/public"
    ErrorLog "logs/demos-error.log"
    CustomLog "logs/demos.log" common 
    <Directory "C:/Apache2/htdocs/demos/public">
        DirectoryIndex index.php
        AllowOverride All 
    </Directory>

    Alias /zf-basic-project "C:/Apache2/htdocs/zf-basic-project/public/"
    <Directory "C:/Apache2/htdocs/zf-basic-project/public">     
        DirectoryIndex index.php
        AllowOverride None
        Require all granted

        RewriteEngine On
        RewriteBase /zf-basic-project
        RewriteCond %{REQUEST_URI} !^/zf-basic-project [NC]
        RewriteRule ^(/?)(.*) /zf-basic-project/$2 [PT]

        RewriteCond %{REQUEST_FILENAME} -s [OR]
        RewriteCond %{REQUEST_FILENAME} -l [OR]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^.*$ - [NC,L]
        RewriteRule ^.*$ /zf-basic-project/index.php [NC,L]
    </Directory>
</VirtualHost>

这一半做我想做的;别名使 zf-basic-project 出现在 demos.example.com/zf-basic-project 中,因为它引用 zf-basic-project 项目文件夹的公用文件夹,然后代码使用上面文件夹级别中的文件来查找它需要使用的所有文件。就像它真的在 C:/Apache2/htdocs/zf-basic-project/public 中一样。然后目录部分设置使用文件的权限,我选择将重写规则放在目录中并且不允许 .htaccess 文件,这样我就不必调整项目 .htaccess 文件来添加重写规则(我想保持原项目不变)。

我遇到的问题是因为 zf-basic-project 被写在它自己的子域中,它通过绝对路径引用诸如 CSS 之类的东西,例如/css/default.css 现在它是 demos 子域中的一个文件夹,据浏览器所知,这实际上位于 /zf-basic-project/css/default.css ,因此我尝试在目录中进行重写说 /zf-basic-project/css 实际上是 /css 这是代码:

RewriteCond %{REQUEST_URI} !^/zf-basic-project [NC]
RewriteRule ^(/?)(.*) /zf-basic-project/$2 [PT]

这表示如果链接不以 /zf-basic-project 开头,则将其添加到 URL。它适用于普通项目,但似乎与别名冲突并且不起作用。我还添加了一个 RewriteBase 以作为很好的衡量标准,它似乎也没有做任何事情。当应用程序在文件夹中运行时,其余的重写工作正常,但由于链接错误,它缺少 CSS、JavaScript 等,所以有谁知道让重写规则工作的修复程序,即 /css 被视为 /zf-基本项目/css。

我当然可以重做所有指向 CSS 等的链接,但我不想这样做,因为我想保持项目与最初的完全一样,因为它是一个演示,通常你不会在 sub文件夹,所以为了让事情更清楚,最好保持尽可能不修改。

提前感谢您的帮助,非常感谢,我必须花费至少 10 个小时来修复它,但似乎无法找到解决方案。

附言。对于那些好奇的人,我想与其他人一起包含在演示子域中的 Zend Framework 项目位于 GitHub 上 https://github.com/paulalbinson/zf-basic-project

【问题讨论】:

    标签: apache mod-rewrite mod-alias


    【解决方案1】:

    据我所知,你的重写条件永远不会是真的。

    首先,当 URL 在/zf-basic-project 下时,您要求重写:

    RewriteBase /zf-basic-project
    

    然后你要求匹配任何不以/zf-basic-project 开头的东西(这刚刚违反了上述规定,因此不会匹配):

    RewriteCond %{REQUEST_URI} !^/zf-basic-project [NC]
    

    意思是……

    RewriteRule ^(/?)(.*) /zf-basic-project/$2 [PT]
    

    ...不可能发生,因为如果 URL 不是以 /zf-basic-project 开头,则假定它是“上层”项目的一部分,即 C:/Apache2/htdocs/demos/public 内部的那个。

    我可能是错的(如果是这样的话,毫无疑问有人会纠正我),但在我看来就是这样。

    【讨论】:

    • 好吧,我明白你的意思了,即使没有 RewriteBase /zf-basic-project 它仍然无法工作。
    • 不,我希望如此。 RewriteBase 指令本身不是问题。对我来说,你想要什么的前提是有缺陷的。 /css/foo.css 将由C:/Apache2/htdocs/demos/public 中的应用程序处理
    • 好的,所以我们保留 RewriteBase,它是: RewriteCond %{REQUEST_URI} !^/zf-basic-project [NC] RewriteRule ^(/?)(.*) /zf-basic-project /$2 [PT] 这就是问题所在,但必须有可能以某种方式说 /css 是 /zf-basic-project/css。它可能永远不会重写,因此它为什么不起作用,但肯定有办法做到这一点。
    • 到目前为止,我能看到的唯一明智的事情是在输出 HTML 之前编写一个函数并找到所有链接、srcs 等并说如果还没有 /zf-basic-project 然后将其添加.
    • 我会在视图/布局的适当位置使用baseUrl helper。从未在您的确切情况下尝试过,但我愿意猜测它会做正确的事情。另外,我会使用 url view helper 为其他操作生成 URL。
    猜你喜欢
    • 2011-03-08
    • 2011-11-13
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2016-10-15
    • 1970-01-01
    相关资源
    最近更新 更多