2016-05-04 9 views
2

Ich fange an, eine Webanwendung zu entwickeln, die AngularJS Frontend und Laravel Backend hat. Zu diesem Zeitpunkt habe ich zwei Verzeichnisse in meinem XAMP htdocs - eines für AngularJS Projekt, das von grunt Embedded Server auf localhost Port 9000 und andere Projekt ist Laravel, die von XAMP Apache/PHP auf localhost post 8081 serviert wird. Ich sehe Probleme mit $ http Anfragen an die andere Laravel-Anwendung und andere URLs aus dem äußeren Internet, die ich als Test-URLs verwende - anscheinend ist dies wegen Cross-Site-SicherheitsschutzVerschiedene Server für AngularJS und PHP?

Das führt mich zu der Frage - ist es möglich zu haben zwei Server (oder mindestens ein Server mit verschiedenen Ports - jeder Port kann von verschiedenen Servern bedient werden) für Frontend/Backend-Anwendungen? Ich weiß, dass dies für GET-Anfragen möglich ist, die durch JSONP-Anfragen ersetzt werden sollen. Aber was ist mit anderen HTTP-Verben - gibt es $ http-Methoden, die PUT, DELETE und ähnliche Anfragen an den anderen Server oder an den anderen Port desselben Servers/derselben Anwendung stellen können?

Oder die einzige Möglichkeit besteht darin, sowohl das Frontend als auch das Backend auf demselben Server/Port in derselben Anwendung auszuführen. Das bedeutet, dass ich AngularJS als Teil einer PHP- oder Java-Anwendung hosten sollte und dafür nicht grunzen sollte, oder?

Das Anfangsproblem erwuchs aus berühmten Angular JS http Status -1 Fehler. Ich verfolge genau Tutorial http://www.tutorials.kode-blog.com/laravel-5-angularjs-tutorial und mein Code:

return $http({ 
    method: 'GET', //'JSONP', 
    url: 'http://localhost:8081/testserver/server.php/api/v1/contracts', 
    //url: 'http://jsonplaceholder.typicode.com/posts', 
    timeout: 100000 
    }).then(function(result) { 
     alert(result); 
     return result.data; 
    }, 
    function (error) { 
     alert(error); 
     console.log("v2 my object: %o", error); 
     alert(JSON.stringify(error)); 
    } 
); 

Wenn ich Anforderung an den lokalen Host zu machen, die -1 Fehler vorhanden ist, aber meine Anfrage zu http://jsonplaceholder.typicode.com/posts gibt erwartete Antwort. Ich habe versucht, meine externe IP-Adresse anstelle von localhost zu verwenden, aber der Fehler war immer noch vorhanden. Mein Server-Seite Code verwendet scheinbar Laravel Illuminate -> get() Funktion, die, nehme ich an, für Vertrags Umwandlung Array notwendig, alle die Umwandlung tun Objekte in JSON-Antwort:

public function index($id = null) { 
    if ($id == null) { 
     //this branch is being tested 
     return Contract::orderBy('CONTRACT_NO', 'asc')->get(); 
    } else { 
     return $this->show($id); 
    } 
} 

Es gibt nichts, außer über Server-Antwort - es ist JSON-Array:

[{"CONTRACT_NO":"1","CUSTOMER":null,...}] 
+1

Sie müssen bei CORS aussehen fordern –

+0

Mein erstes Problem ist AngularJS http Status -1 berühmte Probleme. Ich dachte, dass es mit CORS verbunden ist, aber mein Angular läuft auf http: // localhost: 9000/#/contracts und es wurde erfolgreich eine Anfrage an 'url:' http://jsonplaceholder.typicode.com/posts '' aber gemacht Es wirft http-Status -1 für den Localhost Laravel-Dienst.Ich bin mir nicht sicher, ob das ist oder nicht CORS – TomR

+1

Können Sie einen Code schreiben, der zeigt, wie Sie Ihre Anfrage Client-Seite machen, und wie Sie versuchen, es zu behandeln Server-Seite –

Antwort

1

I die folgende Middleware verwenden, um CORS-Anfragen handhaben. Ohne etwas Ähnliches können Sie keine CORS-Anfragen an Ihr Laravel-Backend unterstützen.

Versuchen Sie, etwas wie das Folgende zu verwenden - dies ist derzeit so eingestellt, dass jede Ursprungsanforderung zulässig ist. Während der Produktion möchten Sie diese Datei möglicherweise so anpassen, dass nur Anfragen aus bekannten Quellen zulässig sind.

<?php 

namespace App\Http\Middleware; 

use Closure; 
use Response; 

class CorsMiddleware { 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     // setup array of CORS headers 
     $headers = [ 
      'Access-Control-Allow-Origin' => '*', 
      'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE', 
      'Access-Control-Allow-Headers' => 'Content-Type, Accept, Origin, Authorization, X-Requested-With', 
      'Access-Control-Allow-Credentials' => true, 
      'Access-Control-Expose-Headers' => 'Authorization', 
     ]; 

     // check for OPTIONS request 
     if($request -> getMethod() == 'OPTIONS') 
     { 
      return Response::make('OK', 200, $headers); 
     } 

     // add CORS headers to remaining requests 
     $response = $next($request); 
     foreach($headers as $key => $value) 
     { 
      $response -> headers -> set($key, $value); 
     } 

     return $response; 
    } 

} 

Sie könnten auch in diesem Paket aussehen für das Hinzufügen von CORS Unterstützung Laravel: https://github.com/barryvdh/laravel-cors

+0

Das war es! Das war die richtige Lösung. Middleware sollte in app/Http/Kernel.php registriert werden – TomR

1

es ist möglich, durch virtuelle Hosts auf dem Apache-Server zu konfigurieren. Die Unterscheidung kann durch Verwendung unterschiedlicher Domänennamen (oder Subdomänen), IP-Adressen oder Ports erfolgen.

Beispielkonfiguration an den Ports 80 und 8080:

Listen 80 
Listen 8080 

<VirtualHost 172.20.30.40:80> 
    ServerName www.example.com 
    DocumentRoot "/www/domain-80" 
</VirtualHost> 

<VirtualHost 172.20.30.40:8080> 
    ServerName www.example.com 
    DocumentRoot "/www/domain-8080" 
</VirtualHost>