Laravel многодоменного происхождения CORS - PullRequest
0 голосов
/ 28 августа 2018

Я хочу, чтобы два домена для CORS в моем laravel могли работать с ним локально и на сервере, поэтому я не хочу показывать свое приложение любому домену. Это дерьмо у меня сейчас

public function handle($request, Closure $next)
    {
        return $next($request)
            ->header('Access-Control-Allow-Origin', 'http://localhost:4200')
//            ->header('Access-Control-Allow-Origin', 'http://api.example.com')
            ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE')
            ->header('Access-Control-Allow-Headers', 'Content-Type');
    }

Я не могу сделать это ни как прокомментировал, ни как массив

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Вы можете определить массив источников, которые вы хотите разрешить, а затем проверить входящий запрос, если он один из них:

public function handle($request, Closure $next)
{
    $allowedOrigins = ['example.com', 'example1.com', 'example2.com'];
    $origin = $_SERVER['HTTP_ORIGIN'];

    if (in_array($origin, $allowedOrigins)) {
        return $next($request)
            ->header('Access-Control-Allow-Origin', $origin)
            ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE')
            ->header('Access-Control-Allow-Headers', 'Content-Type');
    }

    return $next($request);
}
0 голосов
/ 22 июня 2019

@ ответ thefallen работает для меня, также у меня была та же проблема @sergey, которую я решил следующим образом.

public function handle($request, Closure $next)
{

  $allowedOrigins = [env('FRONTEND_ENDPOINT', 'http://localhost:8080'), env('WORDPRESS_ENDPOINT', 'http://localhost'), env('EXTRA_ENDPOINT', 'http://127.0.0.1')];

  if($request->server('HTTP_ORIGIN')){
    if (in_array($request->server('HTTP_ORIGIN'), $allowedOrigins)) {
        return $next($request)
            ->header('Access-Control-Allow-Origin', $request->server('HTTP_ORIGIN'))
            ->header('Access-Control-Allow-Origin', '*')
            ->header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE')
            ->header('Access-Control-Allow-Headers', '*');
    }
  }


  return $next($request);

}

таким образом, вы также можете просто установить переменные в файле .env следующим образом.

FRONTEND_ENDPOINT=http://localhost:8080
WORDPRESS_ENDPOINT=http://localhost
EXTRA_ENDPOINT=http://127.0.0.1:8080
0 голосов
/ 28 августа 2018

Вы можете просто проверить, на каком хосте вы находитесь, а затем отправить соответствующий Access-Control-Allow-Origin только для этого.

$request->getHttpHost() даст вам имя хоста, которое использовалось в запросе - если вам просто нужно различить на основе этого, мы, вероятно, можем проигнорировать другие вещи, которые также являются частью источника (протокол, порт) здесь, и просто сделать это что-то вроде

public function handle($request, Closure $next)
    {
        $origin = $request->getHttpHost() == 'localhost' ?
                    'http://localhost:4200' : 'http://api.example.com';

        return $next($request)
            ->header('Access-Control-Allow-Origin', $origin)
            ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE')
            ->header('Access-Control-Allow-Headers', 'Content-Type');
    }

Конечно, вы можете сделать это более "изощренным", если вам это нужно для большего количества возможных источников (например, сопоставить имя хоста с массивом возможных значений, при необходимости принять во внимание протокол и порт), но если вы просто нужны эти два на данный момент, это должно в основном делать.

...