我已成功在几台不同的服务器上运行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/,我列出了以下主要路线:
这里有一些额外的怪异。七个字符的路由导致404错误,六个或更少的结束使用默认的GET路由。
我完全难过了。我认为它与DocumentRoot代码有关,但我不确定究竟是什么。我也试过设置
RewriteBase /public/
/public/.htaccess 中的但似乎没有任何影响。
非常感谢任何帮助。谢谢!
答案 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中删除路径,但这似乎是一种非常糟糕的方式。如果您需要子目录继续工作,您可能需要做更多的思考。 :)