У меня есть эта странная проблема, которую я могу лучше всего описать как «утечка пространства имен». Я установил бродячую коробку под управлением Apache2 с настройкой VHosts для репликации рабочего сервера с точки зрения доменов & субдомены. Я соответственно отредактировал файл hosts моей локальной машины, и мои VHosts работают нормально.
Я также создал скелетное / базовое приложение под 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
была проблема, но я думаю, что исключил это. Он делает то, что должен делать.
Вот пример одной из моих настроек VHost в Apache — все они следуют этой схеме.
<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 & WHM, но это немного беспокоит!
Очевидно, что пространства имен не должны сталкиваться между различными маршрутами документов и VHosts, верно? Что мне не хватает?
Я решил аналогичную проблему в Apache, используя разные локальные IP-адреса для каждого приложения:
/ и т.д. / хосты
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>
...
Вы можете пропустить настройку имен в хостов AN использует IP в .конф Тхо.
Это работает, потому что если вы определяете несколько приложений на одном IP-адресе и порте, Apache, похоже, запоминает каталог, в котором он работает, и не соответствует файлам.
Других решений пока нет …