我知道这里有很多类似的问题但很遗憾没有一个能解决我遇到的问题。我试图弄清楚为什么重写规则在你也有别名时不起作用,下面是对导致问题的情况的解释。
我有很多Zend Framework应用程序,我想要包含在同一个子域中,因为我可以使用有限的子域名,而且我想为我所做的所有项目创建一个站点作为演示/教程它是有意义的把它们放在一个地方。与许多Web应用程序/ MVC解决方案一样,Zend Framework是为每个应用程序设计的,它们位于自己的域或子域上。因此,我正在寻找一个解决方案,使文件夹成为网站/ Web应用程序,就像它是一个子域。这就是我现在所拥有的。
我在以下位置设置了子域名:C:/ Apache2 / htdocs / demos,其中包含一个公共文件夹作为文档根目录(zend框架使用公共文件夹作为文档根目录,其上面有其他文件夹,如应用程序使应用程序正常工作;出于安全原因,这是为了防止用户访问他们不应该访问的文件。我还有我希望作为demos.example.com子域中的文件夹的应用程序的C:/ Apache2 / htdocs / zf-basic-project(同样它还有一个公共文件夹作为文档根目录)。
演示子域的虚拟主机如下所示:
<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 projects文件夹的公用文件夹,然后代码使用上面文件夹级别的文件来查找它需要使用的所有文件。它就像在C:/ Apache2 / htdocs / zf-basic-project / public中一样。目录部分然后设置使用文件的权限,我选择将重写规则放在目录中,不允许.htaccess文件,这样我就不必调整项目.htaccess文件来添加重写规则(我想要保持原始项目不变。)
我遇到的问题是因为zf-basic-project被编写在自己的子域中,它通过绝对路径引用CSS之类的东西,例如/css/default.css现在它是demos子域中的一个文件夹,只要浏览器知道这实际上是在/zf-basic-project/css/default.css,因此我试图在目录中进行重写say / 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项目我希望包含在demo子域中以及其他人在https://github.com/paulalbinson/zf-basic-project的GitHub上
答案 0 :(得分: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
内的一个。
我可能是错的(如果有的话,有人会毫无疑问地纠正我),但这就是我的看法。