【问题标题】:Multiple Zend framework sites on one server一台服务器上的多个 Zend 框架站点
【发布时间】:2011-11-25 16:10:06
【问题描述】:

我在设置我的 httpd.conf 或 .htaccess 文件以识别一台服务器上的多个 zend 框架站点时遇到问题。

对于开发,我只有一台服务器,我正在尝试设置站点,以便我可以像 localhost/app1、localhost/app2 等一样访问它们。

所以现在,当我转到 localhost/app1 时,它确实成功重定向到 localhost/app1/public/index.php,但是当我转到 localhost/app1/index/index 时,我得到了 404。

这是我的虚拟主机文件:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot "/var/www"
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory "/var/www/app1/public">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
    ErrorLog logs/error.log
    CustomLog logs/access.log common
</VirtualHost>

这是我在 /var/www/app1 目录中的 .htaccess 文件:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^.*$ /app1/public/index.php [NC,R,L]

如果我将 vhosts 文件中的 DocumentRoot 行更改为 DocumentRoot "/var/www/app1/public",那么 app1 确实可以正常工作,但我只能在 http://localhost 访问那个...。这可能吗?我想要发生的是如果 /var/www 是文档根目录,那么如果我转到 localhost/app1,这些请求需要重定向到 localhost/app1/public/index.php,如果我转到 localhost/app2 这些请求需要重定向到 localhost/app2/public/index.php。

我希望我解释清楚了,感谢任何帮助。

最后
我最喜欢 Phil 的解决方案,因为我不想更改本地主机文件并使用 ServerName 指令。如果您为每个应用程序拥有一个单独的域名,但在开发环境中不是这样,那么在生产环境中就可以了。

除此之外,我在使用备用目录来提供 Web 内容时遇到了 403 禁止问题。正如我所说,perms 似乎是正确的,问题出在 SE_Linux 上,并且文件的安全上下文未设置为 httpd_sys_content_t。我发布了我发现here 的解决方案,因为它专门处理这个问题。谢谢。

【问题讨论】:

    标签: apache zend-framework .htaccess


    【解决方案1】:

    这就是我要做的...

    1. 将您的应用程序安装在任意位置但在文档根目录之外,例如/home/sudol/apps/app1/home/sudol/apps/app2。确保您的 Apache 用户可以遍历此路径并读取文件。

    2. &lt;VirtualHost&gt; 部分中的public 目录命名

      Alias /app1 /home/sudol/apps/app1/public
      Alias /app2 /home/sudol/apps/app2/public
      
    3. 在适当的&lt;Directory&gt; 部分(每个应用一个)中设置您的访问和重写规则,例如

      <Directory "/home/sudol/apps/app1/public">
          Options Indexes FollowSymLinks MultiViews
          AllowOverride All
          Order allow,deny
          allow from all
      
          RewriteEngine On
          RewriteBase /app1
          RewriteCond %{REQUEST_FILENAME} -s [OR]
          RewriteCond %{REQUEST_FILENAME} -l [OR]
          RewriteCond %{REQUEST_FILENAME} -d
          RewriteRule ^.*$ - [NC,L]
          RewriteRule ^.*$ index.php [NC,L]
      </Directory>
      
    4. 删除 .htaccess 文件,因为您将不再需要它们

    附录

    确保您在应用程序配置中设置了唯一的会话名称。您还可以设置特定的 cookie 路径,但这是可选的,例如

    ; app1/application/configs/application.ini
    resources.session.name = "app1"
    resources.session.cookie_path = "/app1/"
    
    ; app2/application/configs/application.ini
    resources.session.name = "app2"
    resources.session.cookie_path = "/app2/"
    

    【讨论】:

    • 不是正确的方法。使用子域代替未来安全。例如,如果以这种方式使用,如果没有调整,magento(zend 框架项目)将无法工作。
    • @OpenSourceLover “不正确的方式”是什么意思?没有“正确的方式”,只有“方式”。 Magento(这个问题根本没有提到)使用 ZF 组件,但不是标准的 ZF 应用程序。我也看不出使用上述方法是如何工作的。
    • 感谢菲尔的回答。我以这种方式使用什么作为文档根目录?我应该可以通过localhost/app1 访问该应用程序吗?
    • @Phil,你的 application.ini 缺少一些东西,以便 url 的生成正常工作:resources.frontcontroller.baseUrl = '/app1/'
    • 啊哈! SE_Linux...一如既往。 stackoverflow.com/questions/6807317/…
    【解决方案2】:

    最好使用子域,即 app1.localhost 然后 localhost/app1 。由于 cookie 的存储方式(包括会话 cookie)会给您带来问题。它们会不匹配,甚至可能重叠。

    这是设置首选方式的好教程

    http://www.dennisplucinik.com/blog/2007/08/16/setting-up-multiple-virtual-hosts-in-wamp/

    【讨论】:

    • Cookie 数据可能包含避免冲突的路径。见cookiecentral.com/faq/#3.3
    • ...另外,设置一个唯一的会话名称(即cookie名称)可以完全避免冲突,并且通常是一个好习惯
    • 您确实需要在您的答案中总结链接文本。如果该链接断开,则此答案的大部分内容也会断开。
    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 2014-02-21
    • 2023-03-07
    • 1970-01-01
    • 2012-01-16
    相关资源
    最近更新 更多