javascript - the - 對預檢請求的響應未通過訪問控制檢查




the response had http status code 405 (14)

我在使用ngResource調用Amazon Web Services上的REST API時遇到此錯誤:

XMLHttpRequest無法加載 http://server.apiurl.com:8000/s/login?login=facebook 。 對預檢請求的響應未通過訪問控制檢查:請求的資源上不存在“ Access-Control-Allow-Origin”標頭。 因此,不允許訪問源“ http:// localhost ”。 錯誤405

服務:

socialMarkt.factory('loginService', ['$resource', function($resource){    
    var apiAddress = "http://server.apiurl.com:8000/s/login/";
    return $resource(apiAddress, { login:"facebook", access_token: "@access_token" ,facebook_id: "@facebook_id" }, {
                getUser: {method:'POST'}
            });
}]);

控制器:

[...]
loginService.getUser(JSON.stringify(fbObj)),
                function(data){
                    console.log(data);
                },
                function(result) {
                    console.error('Error', result.status);
                }
[...]

我正在使用Chrome,但我不知道該怎麼做才能解決此問題。 我什至將服務器配置為接受源 localhost 標頭。

https://code.i-harness.com


JavaScript XMLHttpRequest Fetch 遵循同源策略。 因此,使用XMLHttpRequest或Fetch的Web應用程序只能向其自己的域發出HTTP請求。

來源: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS : https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

您必須從服務器端發送 Access-Control-Allow-Origin:* HTTP標頭。

如果將Apache用作HTTP服務器,則可以將其添加到Apache配置文件中,如下所示:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

默認情況下,Apache中啟用了Mod_headers,但是,您可能需要通過運行以下命令來確保已啟用:

 a2enmod headers

如果您正在編寫 chrome擴展名

您必須在 manifest.json 添加您域的權限。

"permissions": [
   "http://example.com/*",
   "https://example.com/*"
]

在PHP中,您可以添加標題:

<?php
header ("Access-Control-Allow-Origin: *");
header ("Access-Control-Expose-Headers: Content-Length, X-JSON");
header ("Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS");
header ("Access-Control-Allow-Headers: *");
...

在我的Apache VirtualHost配置文件中,添加了以下幾行:

Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"

RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

如果您偶然使用IIS服務器。 您可以在HTTP請求標頭選項中的標頭下方設置。

Access-Control-Allow-Origin:*
Access-Control-Allow-Methods: 'HEAD, GET, POST, PUT, PATCH, DELETE'
Access-Control-Allow-Headers: 'Origin, Content-Type, X-Auth-Token';

與此所有帖子,獲取等,將正常工作。



導致此錯誤的一個很常見的原因可能是主機API已將請求映射到http方法(例如PUT),而API客戶端正在使用其他http方法(例如POST或GET)調用API


很容易錯過的東西...

在解決方案資源管理器中,右鍵單擊api-project。 在屬性窗口中,將“匿名身份驗證”設置為“已啟用”!


我們的團隊偶爾會使用Vue,axios和C#WebApi看到這種情況。 在您要命中的端點上添加路由屬性可以為我們解決此問題。

[Route("ControllerName/Endpoint")]
[HttpOptions, HttpPost]
public IHttpActionResult Endpoint() { }

我的“ API服務器”是一個PHP應用程序,因此為了解決此問題,我找到了以下解決方案:

將行放在 index.php中

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');

當DNS服務器設置為8.8.8.8(谷歌的)時,我遇到了這個問題。 實際上,問題出在路由器上,我的應用程序嘗試通過Google而不是本地與服務器連接(對於我的特定情況)。 我刪除了8.8.8.8,這解決了問題。 我知道可以通過CORS設置解決此問題,但也許有人會遇到與我相同的麻煩


禁用Chrome安全性。右鍵單擊->屬性->目標,創建Chrome快捷方式,然後粘貼“ C:\ Program Files(x86)\ Google \ Chrome \ Application \ chrome.exe” --disable-web-security --user -data-dir =“ c:/ chromedev”


關於CORS,有一些警告。 首先,它不允許使用通配符 * 但不要讓我受此限制,因為我已經在某處閱讀過它,現在找不到該文章。

如果要從其他域發出請求,則需要添加允許來源標頭。 Access-Control-Allow-Origin: www.other.com

如果您發出的請求會影響服務器資源(例如POST / PUT / PATCH),並且mime類型不同於以下 application/x-www-form-urlencodedmultipart/form-datatext/plain 則瀏覽器將自動發出飛行前OPTIONS請求,以檢查服務器是否允許。

因此,您的API /服務器需要相應地處理這些OPTIONS請求,您需要使用適當的 access control headers 進行響應,並且http響應狀態代碼必須為 200

標頭應該是這樣的,請根據需要進行調整: Access-Control-Allow-Methods: GET, POST, PUT, PATCH, POST, DELETE, OPTIONS Access-Control-Allow-Headers: Content-Type Access-Control-Max-Age: 86400 max-age標頭很重要,在我的情況下,沒有它就無法使用,我想瀏覽器需要“訪問權限”有效期的信息。

另外,如果您正在從其他域發出具有 application/json mime的 POST 請求,則還需要添加前面提到的allow origin標頭,因此如下所示:

Access-Control-Allow-Origin: www.other.com Access-Control-Allow-Methods: GET, POST, PUT, PATCH, POST, DELETE, OPTIONS Access-Control-Allow-Headers: Content-Type Access-Control-Max-Age: 86400

當預檢成功並獲得所有所需信息後,您的實際請求將被提出。

一般來說,在初始或飛行前請求中請求的任何 Access-Control 標頭都應在響應中給出,以使其起作用。

此鏈接 的MDN文檔中有一個很好的示例,您還應該查看 此SO帖子。


GeoServer 的獨立發行版包括Jetty應用程序服務器。 啟用跨域資源共享(CORS),以允許您自己域外的JavaScript應用程序使用GeoServer。

從webapps / geoserver / WEB-INF / web.xml中取消註釋以下 <filter><filter-mapping>

 const s3 = new AWS.S3({
 accessKeyId: config.awsAccessKeyID,
 secretAccessKey: config.awsSecretAccessKey,
 region: 'eu-west-2'  // add region here });




http-status-code-405