CakePHP,CGI和mod_rewrite

时间:2012-08-22 20:26:35

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

我必须在具有CGI-PHP的环境中运行我的CakePHP 2.1应用程序,并且无法声明apache别名。我想用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的不同设置,但这里似乎没有任何帮助。

如果有人能给我一个如何解决这个问题的指针,我真的很感激。

3 个答案:

答案 0 :(得分:2)

  

如果有人能给我一个如何解决这个问题的指针,我真的很感激。

然后我会给你一个指针,因为我不知道答案。 :)

您是否阅读了this question我遇到与您的问题非常相似的问题?

答案 1 :(得分:1)

/〜用户名网址是用mod_userdir,mod_rewrite生成的,但是条带〜字符

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

RewriteBase /~username/path/to/cake

所有涉及的htaccess文件

答案 2 :(得分:1)

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

它希望将cakephp解释为控制器名称这一事实可以解决这个问题。

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

RewriteBase /

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

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

  1. 在app / .htaccess中:/
  2. 在app / webroot / .htaccess中:/webroot/