2016-05-31 18 views
5

Ogni volta che torno nella storia sul mio sito web laravel, la risposta che vedo è questa:laravel 5 e strano bug: le parentesi graffe sul retro

{} 

Quando vado avanti a dove ero prima di questo, mostra anche quelle parentesi.

Il problema non si verifica se avvio Strumenti di sviluppo in Chrome con l'opzione Disattiva cache. Il Content-Type di ciò che viene restituito è effettivamente application/json. In Firefox non c'è questo problema.

Succede perché uno dei miei Middlewares. Ho scritto il middleware AjaxJson per tradurre tutte le richieste Ajax in risposta JSON. Stranamente, quando torno indietro nella storia, Google Chrome fa questa richiesta Ajax. Esso contiene questa intestazione:

X-richiesta-Con: XMLHttpRequest

E quindi $request->ajax() rendimenti true.

Questo è il mio middleware:

<?php 

namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Http\Response; 

class AjaxJson 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     $response = $next($request); 

     if (!$request->ajax()) { 
      return $response; 
     } 

     if (!$response instanceof Response) { 
      return $response; 
     } 

     return response()->json($response->getOriginalContent(), $response->status()); 
    } 
} 

Che cosa sto facendo di sbagliato?


UPDATE

ho scoperto no-store rapporto qualità-Cache-Control intestazione di risposta. Impedisce a Chrome di utilizzare la cache quando si fa clic sul pulsante Indietro. Ho creato un middleware per impostare Cache-Control in questo modo:

Cache-Control: private, max-age = 0, no-cache, no-store

Per favore fatemi sapere ragazzi, se si sa modo migliore per risolvere questo problema.

risposta

0

tenta di elaborare la richiesta dopo convalide:

public function handle($request, Closure $next) 
{ 
    if ($request->ajax()) { 
     return response()->json($response->getOriginalContent(), $response->status()); 
    } 

    return $next($request);   
} 
+0

Come è diverso da quello che ho fatto? –

+0

Esistono due tipi di middleware: 1. I middleware chiamati prima che la richiesta arrivi ai controller. 2. Il middleware chiamato dopo la richiesta arriva ai controller. Quindi chiamando '$ next ($ request);' immediatamente nel metodo handle sta applicando il middleware dopo tutto. – manix

+0

Ok, ora capisco il tuo punto. Il problema era qualcosa di completamente diverso però, aggiornerò presto questo argomento. –