Zend Framework:从路由获取子域参数

Posted

技术标签:

【中文标题】Zend Framework:从路由获取子域参数【英文标题】:Zend Framework: get subdomain parameter from route 【发布时间】:2011-07-08 01:35:46 【问题描述】:

更新: 解决了。问题是因为我们使用 nginx 作为前端。所以 nginx 不会将 HTTP_HOST 传递给 apache。


你好!

我在生产服务器上的基本控制器中获取子域参数时遇到问题,而在本地主机上没问题。来自 url 的其他参数,如控制器,按应有的方式返回操作。

这在生产中返回 null:

$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]

这是我的虚拟主机设置:

<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>

有人知道为什么会这样吗?

更新:

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 再次遇到同样的问题

【问题讨论】:

看来我们需要检查您正在使用的路线。 请创建一个答案,而不是回答答案中的问题。稍微阐述一下。 【参考方案1】:

使用以下内容:

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)。

【讨论】:

我在使用它时遇到了同样的问题。我的路由器在本地主机上工作正常。这意味着问题不在于他们,而在于 apache 方面的某个地方。 你真的在你的本地主机上用子域测试过它们吗?如果它在本地工作并且不能在线工作,那么它可能是应用程序中的配置问题(即您的 siteUri 可能是错误的)或 apache 配置中的问题。顺便说一句,您更改设置后是否重新启动了 apache?【参考方案2】:

解决了。问题是因为我们使用 nginx 作为前端。所以 nginx 不会将 HTTP_HOST 传递给 apache。

【讨论】:

以上是关于Zend Framework:从路由获取子域参数的主要内容,如果未能解决你的问题,请参考以下文章

Zend Framework 2 中的路由,跳过 url 中的“索引”操作但获取 id

PHP Zend Framework:从应用程序的任何位置获取引导资源

通用页面的 Zend Framework 路由?

更新:在 Zend Framework 中管理静态内容的最佳实践?

如何使用Zend Framework 2路由选择控制器命名空间?

Zend Framework 2无法从mail.local.php加载配置