【问题标题】:Routing issues with Slim Framework running on AppFog在 AppFog 上运行的 Slim 框架的路由问题
【发布时间】:2013-03-15 23:08:23
【问题描述】:

我已经在几个不同的服务器上成功地运行了 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 => 有效,但在 url 中需要“/public”

还有一些额外的怪异之处。七个字符的路由会导致 404 错误,六个或更少会使用默认的 GET 路由。

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

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

RewriteBase /public/

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

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

【问题讨论】:

  • 我不熟悉 AppFog,但是您是否尝试过删除您的 root .htaccess 文件并包括公共目录的 .htaccess 下的那些文件?还消除了公共的 RewriteRule 并重写为 index.php/$1
  • @GaryM 谢谢。我尝试了您的建议,但是 root 目录在技术上是 Web 根目录,所以我认为需要第一个 .htaccess 文件才能实际重定向到 /public/ 目录。
  • 我自己也遇到了与 AppFog 相同的问题。你找到解决办法了吗?
  • 对此也有任何解决方案

标签: php .htaccess slim appfog


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

【讨论】:

  • 仅供参考,好像其他人已经报告了这个问题:github.com/codeguy/Slim/issues/521
  • 这真的很有用,谢谢。您并没有完全涵盖我在 github 上添加的一些边缘情况,但它们很简单(如果您公开但不是 index.php,反之亦然)。
  • 那个解决方案对我不起作用,我正在使用这个 hack 但我认为应该有更好的方法:help.slimframework.com/discussions/problems/…
猜你喜欢
  • 2015-06-18
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 2016-06-28
  • 2014-08-27
相关资源
最近更新 更多