Silex中的内部转发,而不向浏览器发送301/302

时间:2015-10-27 16:41:46

标签: php symfony silex

我使用Silex的内部转发功能将公共网址映射到内部网址,即my.domain.com/something实际使用<{p}}

my.domain.com/something_else

然而,在Chrome的检测工具中,它显示为结果页面的301,然后提供结果。这是&#34;设计&#34;因为它代表了一个有趣的安全问题?有没有解决这个限制的方法?

虽然我无法发布$subRequest = Request::create( $redirect, $method, [], // params $request->cookies->all(), $request->files->all(), $request->server->all() ); if ($request->getSession()) { $subRequest->setSession($request->getSession()); } return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST, true); 路由控制器的代码,但要点是

something_else

// controller provider
$controller_factory->match('/something_else/{param}', function(...) {
    include 'path/to/some/file';
});

该文件中没有RedirectResponses

编辑我在上面的示例中进行了简化。实际上,// some/file - prepares a file to be downloaded ... return new BinaryFileResponse(); 是一个随机字符串(即/something,它映射到许多内部路由之一(/abcdefghijklmnopqrstuvwxyz)。

3 个答案:

答案 0 :(得分:0)

不,我不这么认为。我相信你的something_else控制器不喜欢子请求并返回重定向响应,你的something控制器无条件地返回到浏览器。

它可以是任何东西。 Silex是一个微框架,这意味着事物可以用数百种不同的方式实现,如果没有看到实际的代码,几乎不可能提出建议。这是它带来的灵活性的另一面。它可能是RedirectableUrlMatcher,或者是控制器,路由器,包含文件,错误处理程序或中间件中的任何内容,这会导致重定向响应。

考虑这个更简单的单脚本应用程序示例:

<?php
// web/index.php
require_once __DIR__.'/../vendor/autoload.php';

$app = new Silex\Application();

$app->get(
    '/the-only-functional',
    function() use ($app) {
        return new \Symfony\Component\HttpFoundation\Response(
            $app['request']->get('q')
        );
    }
);

$app->get(
    '/{whatever}',
    function($whatever) use ($app) {
        $subRequest = \Symfony\Component\HttpFoundation\Request::create(
            '/the-only-functional',
            'GET',
            ['q'=>$whatever]
        );
        $response = $app->handle($subRequest);

        if (200 != $response->getStatusCode()) {
            throw new \Exception(
                "Aha, that's where the problem lies"
                . $response->getStatusCode() . ":"
                . $response->getContent()
            );
        }

        return $response;
    }
)->value('whatever', 'nothing');

$app->run();

将http服务器运行为:

php -S localhost:8081 -d "date.timezone=UTC" -t web  web/index.php

你可以尝试不同的排列:

curl -v http://localhost:8081/
curl -v http://localhost:8081/blah-blah
curl -v http://localhost:8081/the-only-functional?q=direct
curl -v http://localhost:8081/?q=this+example+does+not+forward+query+string

总是得到200回复​​。

不幸的是,如果不共享代码,您可以自行调试应用。唯一明智的建议是在返回之前分析子响应,并且可以记录回溯以本地化问题。

答案 1 :(得分:0)

对此的解决方案是单个字符修复:/

给出以下定义:

$controller_factory->match('/something_else/{param}/', function($app, $param) { ... });
$controller_factory->match('/something', function($app) {
    // do the redirect to /something_else/{param}
    $redirect = '/something_else/hello';
    ...
});
你能发现它吗?事实证明,Symfony智能地转发路由而没有尾随斜杠,这些斜杠将带有斜杠的路由与带有斜线的路径匹配。我的问题是我从我的随机字符串“正确”解析/something_else/something(如果你错过了这个,请参阅我的编辑),但它应该解析为/something_else/something/的意义上是不正确的({1}}注意尾随斜杠)

答案 2 :(得分:-1)

您可以查看子请求: http://silex.sensiolabs.org/doc/cookbook/sub_requests.html

use Silex\Application;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;

$app->get('/something', function (Application $app, Request $request) {
    $subRequest = Request::create('/something_else', ...);
    $response = $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false);

    return $response;
});