Zend Framework: получить параметр субдомена из маршрута - PullRequest
4 голосов
/ 03 марта 2011

UPD: решено.Проблема была в том, что мы используем nginx в качестве внешнего интерфейса.Поэтому nginx не передает HTTP_HOST в apache.


Привет!

У меня проблема с получением параметра поддоменов в моем базовом контроллере на рабочем сервере, когда наlocalhost это нормально.другие параметры из url-подобного контроллера, действие возвращается как должно.

это возвращает ноль при производстве:

$agencyName = (string) $this->_getParam('agency');

без изменений .htaccess:

RewriteEngine On
RewriteRule ^main - [L,NC]
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

а вот мои настройки vhost:

<VirtualHost *:8080>
        ServerName  agencies.domain.com
        ServerAlias *.agencies.domain.com

        ErrorLog /var/log/apache2/agencies.domain_errors.log

        DocumentRoot /var/www/agencies.domain.com/public/

        <Directory "/var/www/agencies.domain.com/public">
                Options -Indexes FollowSymLinks Includes
                DirectoryIndex index.shtml index.php
                AllowOverride All
                # Controls who can get stuff from this server.
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>

Кто-нибудь знает, почему это происходит?

upd:

маршрутизаторы в Bootstrap

public function run()
    {
        $frontController = Zend_Controller_Front::getInstance();
        $router = $frontController->getRouter();

        $plainPathRoute = new Zend_Controller_Router_Route(
                        ':module/:controller/:action/*',
                        array(
                            'module' => 'default',
                            'controller' => 'index',
                            'action' => 'index',
                        )
        );

        $config = $this->getOptions();

        $hostnameRoute = new Zend_Controller_Router_Route_Hostname(
                        ':agency.' . $config['siteUri'],
                        NULL,
                        array(
                            'agency' => '([a-z0-9]+)'
                        )
        );

        $router->addRoute('subdomain', $hostnameRoute->chain($plainPathRoute));

        parent::run();
    }

и да, У меня определено $ config ['siteUri'], и я также попытался использовать: agency.domain.com, снова получая ту же проблему

Ответы [ 2 ]

4 голосов
/ 03 марта 2011

Используйте следующее:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initRoute()
    {
        $this->bootstrap('FrontController');
        $router = $this->getResource('FrontController')->getRouter();
        $router->removeDefaultRoutes();
        $plainPathRoute = new Zend_Controller_Router_Route(
                        ':module/:controller/:action/*',
                        array(
                            'module' => 'default',
                            'controller' => 'index',
                            'action' => 'index',
                        )
        );
        $router->addRoute('default', $plainPathRoute);
        $config = $this->getOptions();
        $hostnameRoute = new Zend_Controller_Router_Route_Hostname(
                        ':agency.' . $config['siteUri'],
                        NULL,
                        array(
                            'agency' => '([a-z0-9]+)'
                        )
        );
        $router->addRoute('subdomain', $hostnameRoute->chain($plainPathRoute));
    }
}

Если вы предоставите действительный поддомен (т. Е. Состоящий только из символов a-z0-9), он будет передан агентству, если нет, агентство не будет установлено. (По крайней мере, у меня работает ZF 1.11.3: p).

1 голос
/ 04 марта 2011

решаемая.Проблема была в том, что мы используем nginx в качестве внешнего интерфейса.Так что nginx не передает HTTP_HOST в apache.

...