在.htaccess中启用cors

Dev*_*man 62 php apache .htaccess slim cors

我已经使用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
Run Code Online (Sandbox Code Playgroud)

我的.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"
Run Code Online (Sandbox Code Playgroud)

是否还有其他东西需要添加到我的.htaccess才能使其正常工作或是否有另一种方法在我的服务器上启用CORS?

Dev*_*man 80

因为我已经将所有内容转发到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']}");

}
Run Code Online (Sandbox Code Playgroud)

这个问题上他的回答是削减武器

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

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

  • 你拯救了生命 (4认同)
  • 到目前为止,您挽救了四条生命,甚至认为我只需要 ```header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");``` 。谢谢 ! (2认同)
  • 查看了其他答案后,我对您的解决方案感到担忧。作者slashingweapon包含了一条注释,该注释已被删除,提示您添加一些逻辑以确定原点是否是受信任的原点。在这里,您已盲目删除它,接受任何来源。不好的做法。 (2认同)

mar*_*sen 73

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

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
Run Code Online (Sandbox Code Playgroud)


小智 19

这对我有用:

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"
Run Code Online (Sandbox Code Playgroud)


小智 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]
Run Code Online (Sandbox Code Playgroud)


jcu*_*bic 7

如本答案中针对特定文件的Custom HTTP Header,您可以使用<File>此代码为单个文件启用CORS:

<Files "index.php">
  Header set Access-Control-Allow-Origin "*"
  Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
</Files>
Run Code Online (Sandbox Code Playgroud)


Kar*_*ler 5

感谢 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
Run Code Online (Sandbox Code Playgroud)

在 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);
});
Run Code Online (Sandbox Code Playgroud)


lev*_*vin 5

将工作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]
Run Code Online (Sandbox Code Playgroud)