在AppFog上运行Slim Framework的路由问题

时间:2013-03-15 23:08:24

标签: php .htaccess slim appfog

我已成功在几台不同的服务器上运行Slim应用程序,并尝试使用相同的结构在AppFog上设置一个,但它运行不正常。

我将从我的目录结构开始:

.htaccess
/public
    .htaccess
    index.php
    /routes
/Slim

root .htaccess 文件包含AppFog文档中的DocumentRoot代码。

RewriteEngine on
RewriteCond %{HTTP_HOST} ^brs.aws.af.cm$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www.brs.aws.af.cm$
RewriteCond %{REQUEST_URI} !public/
RewriteRule (.*) /public/$1 [L]

/ public 目录是我的api代码所在,目前是Slim index.php .htaccess 文件。 index.php 文件包含两个简单路由:

require '../Slim/Slim.php';

\Slim\Slim::registerAutoloader();

$app = new \Slim\Slim();


// Default GET route
$app->get('/', function () {
    echo "Default GET route";
});


// Hello World route
$app->get('/hello/:name', function ($name) {
    echo "Hello, $name";
});


$app->run();

服务器设置在http://brs.aws.af.cm/,我列出了以下主要路线:

  1. / =>使用默认的GET路由
  2. / hello / john => 404错误
  3. / public / hello / john =>有效,但在网址
  4. 中需要“/ public”

    这里有一些额外的怪异。七个字符的路由导致404错误,六个或更少的结束使用默认的GET路由。

    1. / 123456 =>不应该工作,但使用默认的GET路由
    2. / 1234567 => 404错误
    3. 我完全难过了。我认为它与DocumentRoot代码有关,但我不确定究竟是什么。我也试过设置

      RewriteBase /public/
      
      /public/.htaccess 中的

      但似乎没有任何影响。

      非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

在Environment.php第143行的Slim PHP框架中存在一个错误。特别是,它假定$_SERVER['SCRIPT_NAME']路径与$_SERVER['REQUEST_URI']变量兼容。在大多数情况下,这可能是正确的,但是在使用MOD_REWRITE来隐藏中间目录时却没有(正如你引用的.htaccess中所发生的那样)。

正在发生的事情$_SERVER['SCRIPT_NAME']看起来像“/ public / something ......”但是(因为它是隐藏的),$_SERVER['REQUEST_URI']看起来像“/某事......”。

Slim假设请求URI基于脚本名称,这不是这里的情况。我打算通知Slim作者这个bug,但也希望在这里记下它。

您可以通过将Slim / Environment.php第143行修改为:

来修复/解决此问题
if (strpos($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME']) === 0) {
    $env['SCRIPT_NAME'] = $_SERVER['SCRIPT_NAME']; //Without URL rewrite
    $env['PATH_INFO'] = substr_replace($_SERVER['REQUEST_URI'], '', 0, strlen($env['SCRIPT_NAME']));
} else {
    $env['SCRIPT_NAME'] = str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME'])); //With URL rewrite
    $env['PATH_INFO'] = $_SERVER['REQUEST_URI'];
}
// $env['PATH_INFO'] = substr_replace($_SERVER['REQUEST_URI'], '', 0, strlen($env['SCRIPT_NAME']));

至少在我的情况下似乎工作得很好。我认为其意图是从请求uri中删除路径,但这似乎是一种非常糟糕的方式。如果您需要子目录继续工作,您可能需要做更多的思考。 :)