是$request->;isXmlHttpRequest()在symfony2中是否可靠? 让我们考虑下面这样的场景: 用户选择filter按钮,该按钮创建对symfony2控制器的AJAX调用,并以JSON格式返回结果 用户选择一些其他链接,系统会将其重定向到该页面 用户选择浏览器后退按钮 用户将看到JSON响应,但他应该看到原始页面

是$request->;isXmlHttpRequest()在symfony2中是否可靠? 让我们考虑下面这样的场景: 用户选择filter按钮,该按钮创建对symfony2控制器的AJAX调用,并以JSON格式返回结果 用户选择一些其他链接,系统会将其重定向到该页面 用户选择浏览器后退按钮 用户将看到JSON响应,但他应该看到原始页面,ajax,symfony,Ajax,Symfony,我的控制器如下所示: /** * * * @Route("/ajax", name="ajax_route" , options={"expose"=true}) * @Template() */ public function someAction() { $request = $this->getRequest(); $json = array( ); if($request->isXmlHttpRequest()) {

我的控制器如下所示:

/**
 * 
 *
 * @Route("/ajax", name="ajax_route" , options={"expose"=true})
 * @Template()
 */
public function someAction()
{
    $request = $this->getRequest();

    $json = array( );

    if($request->isXmlHttpRequest())
    {

        $res = json_encode($json);

        return new Response($res , 200 , array( 'Content-Type' => 'application/json' ));
    }

    return array( );
}  
换句话说,如果用户按下后退按钮,
if($request->isXmlHttpRequest())
返回true,这不是我想要的结果。这是正常的行为还是什么

是一种简单实用的方法,用于检查HTTP请求是否产生了值为
XMLHttpRequest
X-request-with
头。因此它与
X-request-With
header一样可靠


然而,这并不重要。需要注意的重要一点是,当用户单击后退按钮时,浏览器不会向服务器发送新的HTTP请求。它只是从内存/缓存中恢复页面。

我知道这是一个老问题,但同样的问题刚刚抓住了我,所以我想我还是要写一个答案

在大多数情况下,您可以通过将onUnload处理程序附加到窗口来使back按钮缓存无效,如下所示:

window.addEventListener('unload',function(){});
或者,如果您更喜欢jQuery:

$(window).unload(function(){});
但是,由于AJAX响应是JSON格式的,这显然是不可能的,因为您不能包含脚本片段。在这种情况下,我认为最好的办法是设置
缓存控制:no store
标题,这样浏览器就不会试图缓存结果

在使用Symfony2的OP案例中,您可以使用:

return new Response($res , 200 , array(
    'Content-Type' => 'application/json',
    'Cache-Control' => 'no-store',
));
或者对于更通用的PHP:

header('Cache-Control: no-store');
这里有一个警告,它可能会降低您的性能相当多,这取决于您的应用程序的结构,在这种情况下,您最好的选择可能是为您的AJAX调用使用不同的URL。糟透了,我知道


您可以在bfcache上找到一些文档,这些文档在不同情况下可能更有用。

浏览器仅使用url和请求方法(GET、POST等)作为键来缓存响应

如果您想让浏览器识别其他变体,可以通过在响应中设置Vary标题来告诉它这样做。因此,在您的情况下,您希望告诉浏览器,来自服务器的响应将根据请求中是否设置了“X-Requested-With”头而有所不同

以下是如何做到这一点:

$response = new Response();

$response->setVary("X-Requested-With"); // <=========== Set the Vary header

if($request->isXmlHttpRequest()) {
    //...
}

return $response;
$response=newresponse();
$response->setVary(“X-request-With”);//isXmlHttpRequest()){
//...
}
返回$response;

注意:您希望在响应的两个版本上都设置Vary头(这就是为什么我在if语句之外设置它)。

如何避免返回按钮问题?请注意,Symfony2具有用于处理JSON数据响应的JsonResponse类。使用新的JsonResponse($json)或新的(JsonResponse)->setData($json)