ApacheでCORSヘッダの追加
普段はAPIを作ることが多くFlaskの場合だとFlask-CORSを使うので特に意識していなかったがApacheでヘッダの追加ってどうするのだったかなと調べたので備忘録として記載。 今回はAccess-Control-Allow-Originヘッダの追加のみを記載しているが、同じ要領でヘッダを追加すればいくらでもヘッダを増やすことができる。
- オリジン間リソース共有 (CORS)
https://developer.mozilla.org/ja/docs/Web/HTTP/CORS
ヘッダの追加手順
- ヘッダを追加するにはmod_headersが有効になっているか確認し、無効な場合は有効化する
- /etc/httpd.conf.d/headers.confのファイルを作成して追加する。
mod_headersの確認
CentOSの場合はmoduleの読み込みを/etc/httpd/conf.modules.dのは以下にあるファイルの中で行われているので、ディレクトリを移動してgrepで確認してみる。 以下のように表示された場合LoadModuleの前に#がないので有効化されている
# cd /etc/httpd/conf.modules.d/ # grep headers * 00-base.conf:LoadModule headers_module modules/mod_headers.so 以下の方法でも確認できるので上記の方法でもどちらでも確認は可能 # httpd -M | grep headers_module headers_module (shared)
/etc/httpd/conf.d/headers.confを作成
ファイルを作成して追加したいヘッダを記載する
# vi /etc/httpd/conf.d/headers.conf Header set Access-Control-Allow-Origin "*" # cat /etc/httpd/conf.d/headers.conf Header set Access-Control-Allow-Origin "*"
今回はVirtualHostへのリクエストのときだけCORSのヘッダを付けたかったので実際に設定した内容は以下となる
Listen 192.168.0.251:44444 <VirtualHost *:44444> DocumentRoot /var/www/hoge ServerName hoge.example.com Header set Access-Control-Allow-Origin "*" </VirtualHost>
ヘッダ追加の確認
curlでプリフライトリクエストを送ってヘッダの追加がされているかを確認する。
今回は対象のサーバをhttp://192.168.0.251:44444する。
ヘッダを追加したVirtualHostの方 # curl -v -X OPTIONS -H "Origin;*" -H "Access-Control-Request-Method: GET" -H "Access-Control-Request-Headers: content-type" http://192.168.0.251:44444/index.html * About to connect() to 192.168.0.251 port 44444 (#0) * Trying 192.168.0.251... * Connected to 192.168.0.251 (192.168.0.251) port 44444 (#0) > OPTIONS /index.html HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 192.168.0.251:44444 > Accept: */* > Access-Control-Request-Method: GET > Access-Control-Request-Headers: content-type > < HTTP/1.1 200 OK < Date: Wed, 19 Oct 2022 13:23:42 GMT < Server: Apache/2.4.6 (CentOS) < Allow: OPTIONS,GET,HEAD,POST,TRACE < Access-Control-Allow-Origin: * ← 追加したヘッダが増えている < Content-Length: 0 < Content-Type: text/html; charset=UTF-8 < * Connection #0 to host 192.168.0.251 left intact ヘッダを追加していない方 # curl -v -X OPTIONS -H "Origin;*" -H "Access-Control-Request-Method: GET" -H "Access-Control-Request-Headers: content-type" http://192.168.0.251/index.html * About to connect() to 192.168.0.251 port 80 (#0) * Trying 192.168.0.251... * Connected to 192.168.0.251 (192.168.0.251) port 80 (#0) > OPTIONS /index.html HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 192.168.0.251 > Accept: */* > Access-Control-Request-Method: GET > Access-Control-Request-Headers: content-type > < HTTP/1.1 200 OK < Date: Wed, 19 Oct 2022 13:23:49 GMT < Server: Apache/2.4.6 (CentOS) < Allow: OPTIONS,GET,HEAD,POST,TRACE < Content-Length: 0 < Content-Type: text/html; charset=UTF-8 < * Connection #0 to host 192.168.0.251 left intact