{"id":4714,"date":"2022-08-06T14:25:32","date_gmt":"2022-08-06T06:25:32","guid":{"rendered":"https:\/\/wp.chunhsin.idv.tw\/?p=4714"},"modified":"2022-08-06T23:48:25","modified_gmt":"2022-08-06T15:48:25","slug":"cors%e7%9a%84%e7%b0%a1%e8%bf%b0%e5%8f%8ayii2%e8%a8%ad%e5%ae%9a","status":"publish","type":"post","link":"https:\/\/wp.chunhsin.idv.tw\/?p=4714","title":{"rendered":"CORS\u7684\u7c21\u8ff0\u53caYii2\u8a2d\u5b9a"},"content":{"rendered":"\n<p>cors\u7684\u6a5f\u5236\u662f\uff0c\u7576\u8de8\u7db2\u57df\u900f\u904eajax\u8981\u6c42\u8cc7\u6599\u6642\uff0c\u700f\u89bd\u5668\u6703\u5148\u5411\u4f86\u6e90\u7db2\u7ad9\u8a62\u554f\u662f\u5426\u5141\u8a31\u8de8\u7db2\u57df\u8981\u6c42\u8cc7\u6599\uff0c\u6b64\u70baprelight request\uff0c\u53ea\u56de\u50b3\u76f8\u95dcheaders\uff0c\u4e0d\u8f38\u51fa\u4efb\u4f55\u5167\u5bb9\u3002<\/p>\n\n\n\n<p>\u5982\u679c\u4f86\u6e90\u7db2\u7ad9\u6709\u56de\u61c9cors\u76f8\u95dcheader\u6642\uff0c\u4e26\u4e14ajax request\u7b26\u5408headers\u898f\u7bc4\u7684\u689d\u4ef6\uff0c\u700f\u89bd\u5668\u5c31\u6703\u653e\u884c\u9023\u7dda\u3002\u82e5\u4f86\u6e90\u7db2\u7ad9\u6c92\u6709\u56de\u61c9cors\u76f8\u95dcheaders\u6642\uff0c\u8996\u70ba\u4e0d\u5141\u8a31\u8de8\u7db2\u57df\u9023\u7dda\u3002<\/p>\n\n\n\n<p>\u9019\u9650\u5236\u7684\u57f7\u884c\u662f\u7531\u700f\u89bd\u5668\u7aef\u4f86\u8ca0\u8cac\uff0c\u82e5\u700f\u89bd\u5668\u4e0d\u5be6\u4f5ccors\u6a5f\u5236\uff0c\u5c31\u7b97\u4f86\u6e90\u7db2\u7ad9\u6709\u6b63\u5e38\u56de\u8986 cors headers\u4e5f\u4e0d\u6703\u6709\u6548\u679c\u3002<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>\u6240\u4ee5\u700f\u89bd\u5668\u5728\u5be6\u4f5cajax request\u6642\uff0c\u5be6\u969b\u6703\u6709\u5169\u500brequest\uff0c\u4e00\u500b\u662f\u9810\u5148\u8a62\u554f\u7684options request (prelight request)\uff0c\u5f8c\u9762\u624d\u662f\u5be6\u969b\u7684request\u3002<\/p>\n\n\n\n<p>\u7576\u4f60\u5be6\u4f5c yii\\rest\\Controller \u6216 yii\\rest\\ActiveController\u6642\uff0cyii2\u5b98\u65b9\u5efa\u8b70 authenticator filter \u9700\u79fb\u5230 cors filter \u4e4b\u5f8c\uff0c\u5be6\u969b\u4e0a verb filter \u53ef\u80fd\u4e5f\u9700\u8981\u79fb\u5230 cors filter \u4e4b\u5f8c\uff0c\u5982\u4e0b\u6bb5\u6558\u8ff0\u6240\u793a\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> public function behaviors()\n    {\n        $behaviors = parent::behaviors();\n\n        \/\/ remove authentication filter\n        $auth = $behaviors&#91;'authenticator'];\n        unset($behaviors&#91;'authenticator']);\n        \/\/ remove verb filter\n        $verb = $behaviors&#91;'verbFilter'];\n        unset($behaviors&#91;'verbFilter']);\n\n        \/\/ add CORS filter\n        $behaviors&#91;'corsFilter'] = &#91;\n            'class' =&gt; \\yii\\filters\\Cors::class,\n        ];\n        \/\/ re-add verb filter\n        $behaviors&#91;'verbFilter'] = $verb;\n\n        \/\/ re-add authentication filter\n        $behaviors&#91;'authenticator'] = $auth;\n        \/\/ avoid authentication on CORS-pre-flight requests (HTTP OPTIONS method)\n        $behaviors&#91;'authenticator']&#91;'except'] = &#91;'options'];\n\n        return $behaviors;\n    }<\/code><\/pre>\n\n\n\n<p>\u56e0\u70ba\u57fa\u790e\u985e\u5225\u7684behaviors\u4e26\u4e0d\u5305\u62eccors filter\uff0c\u56e0\u6b64\u5728\u7e7c\u627f\u985e\u5225\u8a2d\u5b9acors filters\u6642\uff0c\u5176\u57f7\u884c\u9806\u5e8f\u6703\u665a\u65bcverb filter\uff0c\u800c\u6309\u9810\u8a2dverb filter\u8a2d\u5b9a\uff0coptions\u662f\u6703\u88ab\u64cb\u6389\u7684\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    \/**\n     * {@inheritdoc}\n     *\/\n    public function behaviors()\n    {\n        return &#91;\n            'contentNegotiator' =&gt; &#91;\n                'class' =&gt; ContentNegotiator::className(),\n                'formats' =&gt; &#91;\n                    'application\/json' =&gt; Response::FORMAT_JSON,\n                    'application\/xml' =&gt; Response::FORMAT_XML,\n                ],\n            ],\n            'verbFilter' =&gt; &#91;\n                'class' =&gt; VerbFilter::className(),\n                'actions' =&gt; $this-&gt;verbs(),\n            ],\n            'authenticator' =&gt; &#91;\n                'class' =&gt; CompositeAuth::className(),\n            ],\n            'rateLimiter' =&gt; &#91;\n                'class' =&gt; RateLimiter::className(),\n            ],\n        ];\n    }<\/code><\/pre>\n\n\n\n<p>\u57fa\u790e\u985e\u5225\u7684behaviors<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    \/**\n     * {@inheritdoc}\n     *\/\n    protected function verbs()\n    {\n        return &#91;\n            'index' =&gt; &#91;'GET', 'HEAD'],\n            'view' =&gt; &#91;'GET', 'HEAD'],\n            'create' =&gt; &#91;'POST'],\n            'update' =&gt; &#91;'PUT', 'PATCH'],\n            'delete' =&gt; &#91;'DELETE'],\n        ];\n    }<\/code><\/pre>\n\n\n\n<p>\u9810\u8a2dverb\u8a2d\u5b9a\u3002<\/p>\n\n\n\n<p>\u9019\u88e1\u6709\u5169\u500b\u4f5c\u6cd5\uff0c\u4e00\u500b\u5373\u662f\u524d\u8ff0\u5c07 verb filter \u79fb\u5230 cors filter \u4e4b\u5f8c\u3002<\/p>\n\n\n\n<p>\u53e6\u5916\u4e00\u500b\u5c31\u662f\u5728verb\u8a2d\u5b9a\u88e1\uff0c\u5c07\u6703\u7522\u751foptions prelight request\u7684method\u88e1\u518d\u52a0\u4e0aoptions\uff0c\u5be6\u6e2c\u6703\u7522\u751foptions\u7684method\u61c9\u8a72\u5c31\u662f\u975eget\u3001post\u7684method\uff0c\u56e0\u6b64\u82e5\u63a1\u7528\u7b2c\u4e8c\u7a2e\u65b9\u6cd5\uff0cput\u3001 patch\u3001 delete\u7b49method\u90fd\u8981\u518d\u52a0\u4e0aoptions\uff0c\u624d\u80fd\u901a\u904everb filter\u3002\u53c3\u95b1<a href=\"https:\/\/developer.mozilla.org\/zh-TW\/docs\/Web\/HTTP\/CORS#%E7%B0%A1%E5%96%AE%E8%AB%8B%E6%B1%82\" data-type=\"URL\" data-id=\"https:\/\/developer.mozilla.org\/zh-TW\/docs\/Web\/HTTP\/CORS#%E7%B0%A1%E5%96%AE%E8%AB%8B%E6%B1%82\">\u7c21\u6613\u8acb\u6c42<\/a>\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    protected function verbs()\n    {\n        return &#91;\n            'index' =&gt; &#91;'GET', 'HEAD'],\n            'view' =&gt; &#91;'GET', 'HEAD'],\n            'create' =&gt; &#91;'POST'],\n            'update' =&gt; &#91;'PUT', 'PATCH','OPTIONS'],\n            'delete' =&gt; &#91;'DELETE','OPTIONS'],\n        ];\n    }<\/code><\/pre>\n\n\n\n<p>\u53e6\u5916\uff0ccors filter\u9810\u8a2d\u8a2d\u5b9a\u6703\u8b93ajax\u8655\u7406\u56de\u50b3\u503c\u6642\u7121\u6cd5\u53d6\u5f97\u6240\u6709headers\u3002\u4e0b\u5217\u5716\u793a\u7531\u5de6\u81f3\u53f3\uff0c\u5206\u5225\u662fchrome\u5be6\u969b\u8a18\u9304\u7684ajax response headers, ajax\u547c\u53eb\u6558\u8ff0\u4ee5\u53ca\u6558\u8ff0\u88e1\u53d6\u5f97\u7684\u6240\u6709headers\u8f38\u51fa\u3002\u770b\u5f97\u51fa\u4f86ajax\u56de\u50b3\u7d50\u679c\u80fd\u8655\u7406\u7684headers\u5c11\u65bc\u5be6\u969b\u7684headers\u3002<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1008\" height=\"606\" data-id=\"4722\" src=\"https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/1.png\" alt=\"\" class=\"wp-image-4722\" srcset=\"https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/1.png 1008w, https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/1-300x180.png 300w, https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/1-768x462.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"489\" height=\"267\" data-id=\"4721\" src=\"https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/2.png\" alt=\"\" class=\"wp-image-4721\" srcset=\"https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/2.png 489w, https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/2-300x164.png 300w\" sizes=\"auto, (max-width: 489px) 85vw, 489px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"558\" height=\"195\" data-id=\"4720\" src=\"https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/3.png\" alt=\"\" class=\"wp-image-4720\" srcset=\"https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/3.png 558w, https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/3-300x105.png 300w\" sizes=\"auto, (max-width: 558px) 85vw, 558px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<p>\u9019\u6642\u53ef\u4ee5\u91dd\u5c0d\u6307\u5b9aaction\u518d\u8986\u5beb\u9810\u8a2dcors\u8a2d\u5b9a\uff0c\u5982\u4e0b\u6bb5\u6558\u8ff0\u6240\u793a\u3002\u9019\u6a23 Access-Control-Expose-Headers \u88e1\u6307\u5b9a\u7684header\u5c31\u6703\u51fa\u73fe\u5728 xhr\u7684getAllResponseHeaders\u88e1\u9762\u4e86\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        \/\/ add CORS filter\n        $behaviors&#91;'corsFilter'] = &#91;\n            'class' =&gt; \\yii\\filters\\Cors::class,\n            \/\/\u8986\u5beb\u9810\u8a2d\u7684 Access-Control-Expose-Headers\n            'actions' =&gt; &#91;\n                'index' =&gt; &#91;\n                    'Access-Control-Expose-Headers' =&gt; &#91;\n                        'X-Pagination-Current-Page',\n                        'X-Pagination-Page-Count',\n                        'X-Pagination-Per-Page',\n                        'X-Pagination-Total-Count',\n                    ],\n                ],\n            ],\n        ];<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/5.png\"><img loading=\"lazy\" decoding=\"async\" width=\"538\" height=\"203\" src=\"https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/5.png\" alt=\"\" class=\"wp-image-4725\" srcset=\"https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/5.png 538w, https:\/\/wp.chunhsin.idv.tw\/wp-content\/uploads\/2022\/08\/5-300x113.png 300w\" sizes=\"auto, (max-width: 538px) 85vw, 538px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>cors\u7684\u6a5f\u5236\u662f\uff0c\u7576\u8de8\u7db2\u57df\u900f\u904eajax\u8981\u6c42\u8cc7\u6599\u6642\uff0c\u700f\u89bd\u5668\u6703\u5148\u5411\u4f86\u6e90\u7db2\u7ad9\u8a62\u554f\u662f\u5426\u5141\u8a31\u8de8\u7db2\u57df\u8981\u6c42\u8cc7\u6599\uff0c\u6b64\u70baprel &hellip; <a href=\"https:\/\/wp.chunhsin.idv.tw\/?p=4714\" class=\"more-link\">\u95b1\u8b80\u5168\u6587<span class=\"screen-reader-text\">\u3008CORS\u7684\u7c21\u8ff0\u53caYii2\u8a2d\u5b9a\u3009<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,12],"tags":[405,406,349],"class_list":["post-4714","post","type-post","status-publish","format-standard","hentry","category-php","category-freetalking","tag-cors","tag-restful-api","tag-yii2"],"_links":{"self":[{"href":"https:\/\/wp.chunhsin.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/4714","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.chunhsin.idv.tw\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.chunhsin.idv.tw\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.chunhsin.idv.tw\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.chunhsin.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4714"}],"version-history":[{"count":12,"href":"https:\/\/wp.chunhsin.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/4714\/revisions"}],"predecessor-version":[{"id":4730,"href":"https:\/\/wp.chunhsin.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/4714\/revisions\/4730"}],"wp:attachment":[{"href":"https:\/\/wp.chunhsin.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4714"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.chunhsin.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4714"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.chunhsin.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4714"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}