0

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

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

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

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

<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 等的链接,但我不想这样做,因为我想保持项目与最初一样,因为它是一个演示,通常你不会在子文件夹中让事情更清晰,尽可能保持不变会更好。

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

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

4

1 回答 1

0

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

首先,当 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.

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

于 2012-05-26T19:56:06.340 回答