【问题标题】:CakePHP, CGI and mod_rewriteCakePHP、CGI 和 mod_rewrite
【发布时间】:2012-08-18 08:01:15
【问题描述】:

我必须在具有 CGI-PHP 且不能声明 apache 别名的环境中运行我的 CakePHP 2.1 应用程序。我想使用 mod_rewrite 将请求重定向到 CakePHP 的子域,但这不起作用。

当前设置

  • Webroot 为 ~/user/public_html
  • CakePHP 在~/user/public_html/cakephp/
  • 应该通过dev.mydomain.tld 请求CakePHP

到目前为止我所拥有的是这个(相对于 webroot 的所有路径):

  • ~/user/public_html/.htaccess

    RewriteEngine on
    Options +FollowSymlinks
    RewriteCond %{HTTP_HOST} ^(www\.)?dev\.mydomain.com$ [NC]
    RewriteCond %{REQUEST_URI} !^/cakephp/app/webroot/ [NC]
    RewriteCond %{REQUEST_URI} !/$
    RewriteCond %{DOCUMENT_ROOT}/cakephp/app/webroot%{REQUEST_URI}/ -d
    RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [R,L]
    RewriteCond %{HTTP_HOST} ^(www\.)?dev\.mydomain.com$ [NC]
    RewriteCond %{REQUEST_URI} !^/cakephp/app/webroot/ [NC]
    RewriteRule ^(.*)$ /cakephp/app/webroot/$1 [L]
    
  • ~/user/public_html/cakephp/app/webroot/.htaccess

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
    

问题

请求以某种方式未正确路由(应用程序在我的开发环境中运行没有问题,PHP 作为模块和/cakephp/app/webroot/ 级别的虚拟主机)。当我在dev.mydomain.tld 请求主页时,我只收到一个错误,Cake 告诉我,CakephpController 丢失了。

调试信息

  • $_SERVER 的有趣部分被调试为/cakephp/app/webroot/index.php 的第一行

      [REDIRECT_REDIRECT_REDIRECT_STATUS] => 200
      [REDIRECT_REDIRECT_STATUS] => 200
      [REDIRECT_HANDLER] => php-script
      [REDIRECT_STATUS] => On
      [HTTP_HOST] => dev.mydomain.tld
      [HTTP_CONNECTION] => keep-alive
      [SERVER_SOFTWARE] => Apache/2.2.21 (Unix)
      [SERVER_NAME] => dev.mydomain.tld
      [SERVER_ADDR] => 192.0.43.10
      [SERVER_PORT] => 80
      [DOCUMENT_ROOT] => /home/user/public_html
      [SCRIPT_FILENAME] => /home/user/public_html/cakephp/app/webroot/index.php
      [REDIRECT_URL] => /cakephp/app/webroot/index.php
      [GATEWAY_INTERFACE] => CGI/1.1
      [SERVER_PROTOCOL] => HTTP/1.1
      [REQUEST_METHOD] => GET
      [QUERY_STRING] => 
      [REQUEST_URI] => /
      [SCRIPT_NAME] => /cakephp/app/webroot/index.php
      [_PHP5_WORK_DIR] => /home/user/public_html/cakephp/app/webroot
      [PHP_SELF] => /
      [ORIG_PATH_INFO] => 
      [ORIG_PATH_TRANSLATED] => /home/user/public_html/cakephp/app/webroot/index.php
      [PATH_INFO] => /cakephp/app/webroot/index.php
    
  • 传递给调度程序的CakeRequest 对象的有趣部分:

      url => 'cakephp/app/webroot/index.php'
      base => '/cakephp'
      webroot => '/app/webroot/'
      here => '/cakephp/cakephp/app/webroot/index.php'
    

问题

所以,我在这里没有明白,为什么 CakeRequest 对象在 $_SERVER['REQUEST_URI'] == '/' 时引用了我的文件夹结构。我该怎么做才能做到这一点?首先,我应该在哪里寻找问题:在 mod_rewrite 指令中还是在 CakePHP 本身中? 我尝试了一些方法,包括在所有 .htaccess 文件中设置 RewriteBase 以及在 Configuration 对象中为 App.baseUrl 设置不同的设置,但这里似乎没有任何帮助。

如果有人能指点我如何解决这个问题,我将非常感激。

【问题讨论】:

    标签: apache cakephp mod-rewrite cgi cakephp-2.1


    【解决方案1】:

    /~username url 是用 mod_userdir 生成的,mod_rewrite 但是会去掉 ~ chars

    所以使用默认的 cake htaccess 文件,并添加:

    RewriteBase /~username/path/to/cake
    

    所有涉及的 htaccess 文件

    【讨论】:

    • 我误读了 ~/username 文件路径的 /~username url 请忽略这个答案
    【解决方案2】:

    如果有人能指点我如何解决这个问题,我将非常感激。

    那我给你指点一下,因为我不知道答案。 :)

    你读过this question,我遇到了和你很相似的问题吗?

    【讨论】:

    • 感谢指点!我以前没看过,但你是对的,它看起来很相似。遗憾的是,建议的解决方案对我的情况也没有帮助。我可能会将我的app/webroot 链接到硬网络根以解决此问题,这肯定只会将问题转移到未来。我仍然对解决这个问题非常感兴趣,甚至在看到你遇到同样的问题后更感兴趣。 P.S.:这里不涉及 WAMP。
    • 您也可以阅读此内容,尤其是 cmets,这就是我解决问题的方法:bakery.cakephp.org/articles/BBBThunda/2010/02/25/…
    • ALS,我终于选择了你的答案,因为它最接近我的需要,我不想浪费积分。可以肯定的是,所涉及的托管商存在一些奇怪的服务器配置错误,他们正在努力修复它。这么久了,我很难用合理的默认值覆盖$_SERVER 中的值。这真的非常难看,但在修复服务器配置之前,它可以作为一种解决方法。
    【解决方案3】:

    传统上,将请求重定向到 CakePHP 应用程序到 /cakephp/app/ 级别。

    它希望将cakephp 解释为控制器名称这一事实表明这是问题所在。

    您的问题可能与 ALS 相关,但并不完全相同。你真正想要的,因为你打算让你的 cakephp 应用程序看起来驻留在服务器的根目录,而实际上它不是:

    RewriteBase /
    

    另一个潜在问题是您的开发环境永远不会受到与/cakephp/app 下的.htaccess 文件相关的任何潜在副作用。

    我会尝试首先添加相对于 /cakephp 文件夹的 RewriteBase

    1. 在应用程序/.htaccess 中:/
    2. 在 app/webroot/.htaccess 中:/webroot/

    【讨论】:

      猜你喜欢
      • 2011-10-08
      • 2014-01-09
      • 2011-05-04
      • 1970-01-01
      • 2013-08-21
      • 2013-11-20
      • 2014-06-03
      • 1970-01-01
      • 2012-03-25
      相关资源
      最近更新 更多