我使用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
)。
答案 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;
});