sourcecode

.htaccess에서 cors를 유효하게 하다

copyscript 2022. 9. 24. 10:13
반응형

.htaccess에서 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

.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를 활성화하는 다른 방법이 있습니까?

어쨌든 모든 것을 index.php로 전송했기 때문에 .htaccess 파일이 아닌 PHP로 헤더를 설정해 보려고 했는데, 잘 작동했습니다!YAY! 여기 이 문제가 있는 다른 사람을 위해 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']}");

}

질문에 대한 의 답변은 무기 소탕에 의한 것이다

Slim을 사용하고 있기 때문에 OPTIONS 요청이 HTTP 200 응답을 얻을 수 있도록 이 루트를 추가했습니다.

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

그러면 안 돼요?.htaccess사용하다add대신set?

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

이것이 나에게 효과가 있었다.

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"

답변에서와 같이 사용할 수 있는 특정 파일에 대한 사용자 지정 HTTP 헤더<File>다음 코드를 사용하여 단일 파일에 대해 CORS를 활성화하려면:

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

대신"*"특정 오리진(표준 + 도메인 + 옵션 포트)을 배치할 수 있습니다.

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]

오래된 버전의 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]

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.displaces에 있습니다.

// 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);
});

@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

언급URL : https://stackoverflow.com/questions/14467673/enable-cors-in-htaccess

반응형