我有这个奇怪的问题,我可以最好地描述为"命名空间泄漏"。我已经设置了一个运行Apache2并使用VHosts设置的流浪盒,以便根据域和域复制生产服务器。子域名。我已相应地编辑了本地机器的主机文件,我的VHost工作正常。
我还创建了一个用PhalconPHP编码的骨架/基础应用程序。它是一个多模块化的应用程序,具有开发我的应用程序所需的所有通用功能(实际上重新开发了大量旧的,过时的应用程序)。骨架应用程序运行正常。
我遇到的问题是,如果我在浏览器中访问app1.dev,它就可以了。然后,如果我去app2.dev,app2显然是试图从app1加载一些组件 - 视图等,并给出错误。但是,关闭浏览器并转到app2.dev再次尝试它现在工作正常。然后转到app1.dev,现在已经坏了,并尝试从app2加载组件!我设法跟踪这个奇怪的行为,直到命名空间冲突。
它必须是命名空间冲突,因为我的应用程序都基于骨架应用程序并使用它的名称空间,这对于应用程序的通用部分显然是相同的 - 例如App\backend
等模块, App\frontend
等。如果在破坏的应用程序上,我在浏览器中导航到该应用程序的一部分是唯一的,因此具有唯一的命名空间,它工作正常,因为没有碰撞!另外一些应用程序使用Codeigniter3编码,它不使用命名空间,并且这些应用程序没有此问题。它只会影响具有名称空间的Phalcon应用程序。
我将添加每个应用程序使用.htaccess
将请求定向到位于public/
目录中的前端控制器。
Options FollowSymLinks
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
</IfModule>
我想知道.htaccess
是否是问题,但我认为我已经排除了这一点。它正在做它应该做的事情。
这是我在apache中建立VHost之一的一个例子 - 它们都遵循这种模式。
<VirtualHost *:80>
ServerName app1.dev
ServerAlias www.app1.dev
DocumentRoot /vagrant/www/app1
<Directory "/vagrant/www/app1">
Options Indexes Followsymlinks
AllowOverride All
Order allow,deny
Allow from All
Require all granted
</Directory>
</VirtualHost>
更改每个应用程序中的所有命名空间将是一项非常重要的工作,我认为这不应该是必要的。我不认为这应该是生产服务器上的一个问题,因为它使用CloudLinux / Centos&amp; WHM,但这有点担心!
显然,名称空间不应该跨越不同的文档路径和VHosts对吗?我错过了什么?
答案 0 :(得分:0)
我在Apache中使用不同的本地IP解决了类似的问题:
的/ etc /主机
127.1.0.1 edu.l
127.1.1.1 tech.l
...
/etc/apache2/sites-available/001-blogs.conf
<VirtualHost edu.l:80>
ServerName edu.l
ServerAdmin webmaster@localhost
DocumentRoot /var/www/blog/edu
ErrorLog ${APACHE_LOG_DIR}/edu.error.log
CustomLog ${APACHE_LOG_DIR}/edu.access.log combined
</VirtualHost>
<VirtualHost tech.l:80>
ServerName tech.l
ServerAdmin webmaster@localhost
DocumentRoot /var/www/blog/tech
ErrorLog ${APACHE_LOG_DIR}/tech.error.log
CustomLog ${APACHE_LOG_DIR}/tech.access.log combined
</VirtualHost>
...
您可以忽略在主机中配置名称并使用 .conf 中的IP。
它的工作原理是因为如果你在相同的IP和端口上定义很少的应用程序,Apache似乎记得它正在处理的目录和不匹配的文件。