1

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

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

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

.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 => 有效,但在 url 中需要“/public”

这里有一些额外的奇怪之处。七个字符的路由导致 404 错误,六个或更少最终使用默认的 GET 路由。

  1. /123456 => 不应该工作,但使用默认的 GET 路由
  2. /1234567 => 404 错误

我完全被难住了。我认为它与 DocumentRoot 代码有关,但我不确定到底是什么。我也试过设置

RewriteBase /public/

/public/.htaccess中,但它似乎没有任何影响。

任何帮助将不胜感激。谢谢!

4

1 回答 1

1

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

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

Slim 假设请求 URI 是基于脚本名称的,这里不是这种情况。我计划通知 Slim 作者该错误,但也想在此处记下它。

您可以通过将 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 中删除路径,但这似乎是一种非常可怕的方式。如果您需要子目录来继续工作,您可能需要做更多的思考。:)

于 2013-10-12T21:13:34.847 回答