PHP Slim 框架 CORS

Posted

技术标签:

【中文标题】PHP Slim 框架 CORS【英文标题】:PHP Slimframework CORS 【发布时间】:2017-12-12 18:25:31 【问题描述】:

我对这个 CORS 的事情有点麻烦。 Angular 4 在 localhost:4200 上运行,而 Slimframework 在 localhost:8080 上运行。

我的前端 HTTP 请求:

....
createPartner(partner: Partner): Observable<Partner> 
    let headers = new Headers( 'Content-Type' : 'application/json');
    let options = new RequestOptions( headers: headers );

    return this.http.post(this.regUrl, partner, options)
           .map((res: Response) => 
              return res.json();
           )
           .catch(this.handleError);
  
....

我的中间件:

....
$app->add(function($request, $response, $next) 
$route = $request->getAttribute("route");

$methods = [];

if (!empty($route)) 
    $pattern = $route->getPattern();

    foreach ($this->router->getRoutes() as $route) 
        if ($pattern === $route->getPattern()) 
            $methods = array_merge_recursive($methods, $route->getMethods());
        
    
 else 
    $methods[] = $request->getMethod();


$response = $next($request, $response);


return $response->withHeader("Access-Control-Allow-Methods", implode(",", $methods));
);

我将"determineRouteBeforeAppMiddleware" =&gt; true, 添加到我的设置数组中。

浏览器的 (chrome) 控制台显示:

XMLHttpRequest 无法加载 http://lvh.me/api/partner。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://localhost:4200' 因此不允许访问。

我做错了什么,伙计们? :/

编辑:

忘记了后端URI的8080端口,现在我添加了,新的错误是:

OPTIONS http://lvh.me:8080/api/partner net::ERR_CONNECTION_REFUSED

【问题讨论】:

我的 php 有点生锈,但我想你必须添加 'Access-Control-Allow-Origin: *'),不知道如何使用你的框架来做到这一点,也许通过 $response-&gt;withHeader 是的,我正在尝试使用-&gt;withHeader('Access-Control-Allow-Origin', '*');,但没有任何反应.. 你能转储你从中间件获得的所有标题吗?一些复制/粘贴。也许你的标题被你看不到的东西重写了。发生在我身上很多次。 我现在只用这个中间件,但如果你告诉我该怎么做,我会做的。 在您的return this.http.post(this.regUrl, partner, options) 中是不是这个this.regUrl 某个您正在使用中间件处理并期望中间件响应的网址? 【参考方案1】:

通过Skype解决,将Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers添加到Slim框架中间件。

【讨论】:

【参考方案2】:

将以下内容添加到您的 htaccess 以允许 cors,

<IfModule mod_rewrite.c>

  Header add Access-Control-Allow-Origin "*"

  Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"

  Header add Access-Control-Allow-Headers: "Content-Type"


  RewriteEngine on

  RewriteBase /

</IfModule>

来源:https://gist.github.com/maxparm/3105526

【讨论】:

我也尝试过这种简单的解决方案,但没有奏效。 这个答案只适用于他使用Apache的情况。 我的 .htaccess: RewriteEngine On RewriteCond %REQUEST_FILENAME !-f RewriteRule ^ index.php [QSA,L] &lt;IfModule mod_rewrite.c&gt; Header add Access-Control-Allow-Origin "*" Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT" Header add Access-Control-Allow-Headers: "Content-Type" &lt;/IfModule&gt; 我仍然收到错误消息。

以上是关于PHP Slim 框架 CORS的主要内容,如果未能解决你的问题,请参考以下文章

Slim 框架上 CORS 期间的预检授权标头

php 构建Slim框架作为phar

如何让 Slim 框架工作而无需将 /index.php 放入 URL?

使用 php Slim 框架实现访问控制认证

PHP Slim 框架初体验之无法访问控制器

如何使用Slim框架支持API版本控制