【问题标题】:enable cors in .htaccess在 .htaccess 中启用 cors
【发布时间】:2013-01-06 05:19:00
【问题描述】:

我已经使用 SLIM PHP 框架创建了一个基本的 RESTful 服务,现在我正在尝试连接它,以便我可以从 Angular.js 项目访问该服务。我已经读到 Angular 支持开箱即用的 CORS,我需要做的就是将这一行:Header set Access-Control-Allow-Origin "*" 添加到我的 .htaccess 文件中。

我已经这样做了,我的 REST 应用程序仍在工作(没有来自错误的 .htaccess 的 500 内部服务器错误),但是当我尝试从 test-cors.org 测试它时,它抛出了一个错误。

Fired XHR event: loadstart
Fired XHR event: readystatechange
Fired XHR event: error

XHR status: 0
XHR status text: 
Fired XHR event: loadend

我的 .htaccess 文件如下所示

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /index.php [QSA,L]
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"

我还需要向我的 .htaccess 添加其他内容以使其正常工作,还是有其他方法可以在我的服务器上启用 CORS?

【问题讨论】:

    标签: php apache .htaccess cors slim


    【解决方案1】:

    在这个答案Custom HTTP Header for a specific file 中,您可以使用<File> 使用此代码为单个文件启用 CORS:

    <Files "index.php">
      Header set Access-Control-Allow-Origin "*"
      Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
    </Files>
    

    代替"*",您可以输入特定的来源(协议+域+可选端口)。

    【讨论】:

      【解决方案2】:

      将 100% 工作,在 .htaccess 中申请:

      # Enable cross domain access control
      SetEnvIf Origin "^http(s)?://(.+\.)?(1xyz\.com|2xyz\.com)$" REQUEST_ORIGIN=$0
      Header always set Access-Control-Allow-Origin %{REQUEST_ORIGIN}e env=REQUEST_ORIGIN
      Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
      Header always set Access-Control-Allow-Headers "x-test-header, Origin, X-Requested-With, Content-Type, Accept"
      
      # Force to request 200 for options
      RewriteEngine On
      RewriteCond %{REQUEST_METHOD} OPTIONS
      RewriteRule .* / [R=200,L]
      

      【讨论】:

      • 想补充一点,有必要编辑 SetEnvIf 语句,定义允许 CORS 的遥控器(1xyz.com、2xyz.com)。
      【解决方案3】:

      感谢 Devin,我为我的 SLIM 应用程序找到了多域访问的解决方案。

      在htaccess中:

      SetEnvIf Origin "http(s)?://(www\.)?(allowed.domain.one|allowed.domain.two)$" AccessControlAllowOrigin=$0$1
      Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
      Header set Access-Control-Allow-Credentials true
      

      在 index.php 中

      // Access-Control headers are received during OPTIONS requests
      if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
      
          if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
              header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");         
      
          if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
              header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
      }
      // instead of mapping:
      $app->options('/(:x+)', function() use ($app) {
          //...return correct headers...
          $app->response->setStatus(200);
      });
      

      【讨论】:

        【解决方案4】:

        因为无论如何我都将所有内容都转发到 index.php,所以我想我会尝试在 PHP 中设置标题而不是 .htaccess 文件,它确实有效!耶!这是我为遇到此问题的其他人添加到 index.php 的内容。

        // Allow from any origin
        if (isset($_SERVER['HTTP_ORIGIN'])) {
            // should do a check here to match $_SERVER['HTTP_ORIGIN'] to a
            // whitelist of safe domains
            header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
            header('Access-Control-Allow-Credentials: true');
            header('Access-Control-Max-Age: 86400');    // cache for 1 day
        }
        // Access-Control headers are received during OPTIONS requests
        if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
        
            if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
                header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");         
        
            if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
                header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
        
        }
        

        感谢 slashingweapon 在this question 上的回答

        因为我使用的是 Slim,所以我添加了这条路由,以便 OPTIONS 请求获得 HTTP 200 响应

        // return HTTP 200 for HTTP OPTIONS requests
        $app->map('/:x+', function($x) {
            http_response_code(200);
        })->via('OPTIONS');
        

        【讨论】:

        • 到目前为止,你挽救了四条生命,甚至以为我只需要 header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); 。谢谢!
        • 查看了其他答案后,我对您的解决方案感到担忧。作者 slashingweapon 包含一条您删除的评论,提示您添加一些逻辑来确定来源是否是受信任的来源。在这里,您盲目地将其删除,接受任何来源。不好的做法。
        • @Joe 好点。我用关于检查原点的评论更新了答案
        【解决方案5】:

        我尝试了@abimelex 解决方案,但在 Slim 3.0 中,映射 OPTIONS 请求如下:

        $app = new \Slim\App();
        $app->options('/books/{id}', function ($request, $response, $args) {
            // Return response headers
        });
        

        https://www.slimframework.com/docs/objects/router.html#options-route

        【讨论】:

          【解决方案6】:

          这对我有用:

          Header add Access-Control-Allow-Origin "*"
          Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
          Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
          

          【讨论】:

            【解决方案7】:

            看起来您使用的是旧版本的 slim(2.x)。您只需在 .htaccess 中添加以下行,无需在 PHP 脚本中执行任何操作。

            # Enable cross domain access control
            SetEnvIf Origin "^http(s)?://(.+\.)?(domain_one\.com|domain_two\.net)$" REQUEST_ORIGIN=$0
            Header always set Access-Control-Allow-Origin %{REQUEST_ORIGIN}e env=REQUEST_ORIGIN
            Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE"
            Header always set Access-Control-Allow-Headers: Authorization
            
            # Force to request 200 for options
            RewriteEngine On
            RewriteCond %{REQUEST_METHOD} OPTIONS
            RewriteRule .* / [R=200,L]
            

            【讨论】:

              【解决方案8】:

              .htaccess 不应该使用add 而不是set吗?

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

              【讨论】:

              • 谢谢!这解决了我的问题!我正在使用set,但它不起作用,用 add 修复它来改变它。值得一提的是,这是在 wordpress 博客上完成的,以及 .htaccess 文件中的一些其他内容
              • 这里的文档说“设置”enable-cors.org/server_apache.html。可能造成了很多问题!
              • 我从 set 更改为 add 并且仍然得到 Response for preflight has invalid HTTP status code 400 ..请建议..在这里描述了我的完整帖子:magento.stackexchange.com/questions/170342/…
              • 对我来说第一行就足够了。另外,我猜第二行不应该有冒号?
              • Apache 文档说是“设置”httpd.apache.org/docs/2.4/mod/mod_headers.html ?
              猜你喜欢
              • 2017-01-23
              • 2020-02-18
              • 2013-06-12
              • 2020-02-18
              • 2015-06-15
              • 2019-01-01
              • 2015-01-09
              • 1970-01-01
              相关资源
              最近更新 更多