【问题标题】:404 after deploying zend application部署zend应用程序后出现404
【发布时间】:2014-01-24 05:04:51
【问题描述】:

我已经在本地服务器(ubuntu)上部署了一个 zend 应用程序,默认页面可以正常工作,但所有其他应用程序都会抛出 404 not found 页面。

我的 index.php

    // Define path to application directory defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(), )));

/** Zend_Application */ require_once 'Zend/Application.php';

// Create application, bootstrap, and run $application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini' ); $application->bootstrap()

            ->run();

应用程序.ini

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.params.displayExceptions = 0



resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules = ""
resources.frontController.params.prefixDefaultModule = "1"

resources.db.adapter = mysqli
resources.db.params.host = localhost
resources.db.params.username = root
resources.db.params.password = ""
resources.db.params.dbname = assalam

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

Bootsrap 文件中的_initAutoLoader 函数

protected function _initAutoLoad(){
        $modelLoader = new Zend_Application_Module_Autoloader(array(
                               'namespace'=>'',
                               'basePath'=>APPLICATION_PATH . '/modules/default'
                             ));
        if(Zend_Auth::getInstance()->hasIdentity()){
            Zend_Registry::set('role',Zend_Auth::getInstance()->getStorage()->read()->role);

        }else {
            Zend_Registry::set('role','Visiteurs');
        }

        $this->_acl = new Model_UsersAcls();
        $this->_auth = Zend_Auth::getInstance();

        $fc = Zend_Controller_Front::getInstance();
        $fc->registerPlugin(new Plugin_AccessCheck($this->_acl));

        return $modelLoader;
     }

apache2.conf 包含

<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

htaccess 文件包含

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*)$ - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]

虚拟主机代码

<VirtualHost *:80>
  ServerName localhost
  DocumentRoot /var/www/

  <Directory /var/www/>
      Options +FollowSymlinks +SymLinksIfOwnerMatch
      AllowOverride All
  </Directory>
</VirtualHost>

【问题讨论】:

    标签: php zend-framework deployment frameworks


    【解决方案1】:

    请检查您是否有虚拟主机,如果没有,请创建类似此示例的内容:

    <VirtualHost *:80>
      ServerName helloWorld.dev
      DocumentRoot /Users/myuser/Sites/HelloWorld/public
    
      <Directory /Users/myuser/Sites/HelloWorld/public> 
          Options +FollowSymlinks +SymLinksIfOwnerMatch
          AllowOverride All
      </Directory>
    </VirtualHost>
    

    也在你的主机文件上

    127.0.0.1       helloWorld.dev
    

    我也建议检查文件夹权限

    myuser:HelloWorld myuser$ ll
    total 0
    drwxr-xr-x  8 myuser  staff   272B Jan  6 11:54 application
    drwxr-xr-x  3 myuser  staff   102B Jan  6 11:54 docs
    drwxr-xr-x  4 myuser  staff   136B Dec 28 20:54 library
    drwxr-xr-x  4 myuser  staff   136B Jan  6 11:54 public
    drwxr-xr-x  6 myuser  staff   204B Jan  6 11:54 tests
    myuser:HelloWorld myuser$ pwd
    /Users/myuser/Sites/HelloWorld
    myuser:HelloWorld myuser$ 
    

    在文件 /etc/apache2/users/myuser.conf 中添加以下定义。如果此文件不存在,请创建它

    <Directory "/Users/myuser/Sites/">
         Options Indexes MultiViews
         AllowOverride None
         Order allow,deny
         Allow from all
    </Directory>
    

    【讨论】:

    • 我不知道如何使用虚拟主机,因为我有一台用作服务器的机器,我的应用程序位于此根目录 /var/www/ 中,并且 url 是 192.168。 1.30
    • 我尝试添加虚拟主机,但公用文件夹始终没有出现,我将虚拟主机的代码放在请求中
    • 很久以前我在公用文件夹中遇到了同样的问题,我在 /etc/apache2/users 上创建了一个名为 myuser.conf 的文件,其定义如下 Options Indexes MultiViews AllowOverride None Order allow,deny Allow from all
    • 谢谢我通过激活apache中的重写模块解决了这个问题,非常感谢您的帮助
    • 没问题,请将此问题标记为已解决。问候
    【解决方案2】:

    您是否设置了 htaccess 文件?

    您的服务器是否允许运行 htaccess 文件(检查您的服务器配置文件中的 AllowOverride 是否设置为 All)。

    例如,这是我的一个项目中的 htaccess 文件:

    Options +FollowSymLinks 
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^(.*)/(.*)$ index.php [NC,L]
    RewriteRule ^(.*)/(.*)/(.*)$ index.php [NC,L]
    RewriteRule ^(.*)/(.*)/(.*)/(.*)$ index.php [NC,L]
    RewriteRule ^.*$ index.php [NC,L]
    
    RewriteCond %{REQUEST_FILENAME} !^(.*)\.css$
    RewriteCond %{REQUEST_FILENAME} !^(.*)\.js$
    RewriteCond %{REQUEST_FILENAME} !public/gateway/(.*)$
    RewriteRule ^.*$ - [NC,L]
    

    【讨论】:

    • 这是我的 .htaccess RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC ,L] RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$ RewriteRule ^(.*)$ - [E=BASE:%1] RewriteRule ^(.*)$ % {ENV:BASE}index.php [NC,L]
    • 我做到了,但现在我无法访问公用文件夹,它不可见并且出现内部服务器错误页面
    • 我在这里放了一个我的 htaccess 文件的示例供您比较。
    • 我放了 htaccess 内容,我试过你的代码,但公用文件夹不会显示
    • 谢谢我通过激活apache中的重写模块解决了这个问题,非常感谢您的帮助
    【解决方案3】:

    您是如何部署它的?您使用过 Zend Server 部署吗?有没有设置虚拟主机?你打电话的网址是什么?项目路径是什么?

    【讨论】:

    • 我没有使用 Zend Server 我有一台机器用作服务器,基于 ubuntu 服务器和 apache。我将所有文件复制到 www 目录。 URL 是 192.168.1.30,应用程序路径是默认的“public”,当我输入 192.168.1.30/public 时,前面会显示,但是当我想导航到其他路径时,例如 192.168.1.30/public/authentification/登录出现404页面,其他页面都一样
    • 那么它肯定是 AllowOverride。您的 VirtualHost 配置必须设置 AllowOverride 才能看到 Elie 的评论。
    • 我做到了,但现在我无法访问公用文件夹,它不可见并且出现内部服务器错误页面
    • 发布您的 VirtualHost 配置,让我们看看有什么问题。
    • 我已经在上面的请求中添加了它,当我将 AllowOverride 设置为 All 时,我获得了另一个错误页面并且文件夹 public 不再可以访问,应用程序位于 /var/ www/ 文件夹
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2017-11-29
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多