上記はよく知られた方法かと思いますので、詳細は割愛します。
本記事で記載したいことは、上記2つを併用した方が安心だよということです。
まずは、用語の説明からです。
AWS Managed Prefix Listは、AWSによって管理されるIPアドレスのプレフィックスリストです。特定のAWSサービス(例えばCloudFrontやAmazon S3など)のIPアドレス範囲を含んでおり、ネットワーク設定やセキュリティ設定を簡素化するために使用されます。
本記事では、「マネージドプレフィックスリスト=CloudFrontのIP」として記載します。
カスタム HTTP ヘッダーは、HTTP リクエストやレスポンスに含まれるユーザー定義のヘッダーであり、標準の HTTP ヘッダーではカバーされない追加の情報を送信するために使用されるものです。
ALB(ロードバランサー)でCloudFront経由のアクセスに絞る際に、マネージドプレフィックスリストとカスタム HTTP ヘッダーを併用する場合、以下のようになります。
マネージドプレフィックスリスト(managed prefix list)だけでは、CloudFrontのIP制限のため、CloudFrontからの接続であれば、別アカウントのものでも許可してしまいます。
そのため、カスタム HTTP ヘッダーも併用が必要となります。カスタム HTTP ヘッダーにより、自分が作成したCloudFrontのみにアクセスを絞ることができます。
2段階で網をかけておいた方が安心ですね。
公式記事に詳しく書いてあるので、以下の公式の記事をご参照ください。
ALB(ロードバランサー)でCloudFront経由のアクセスに絞るときは、カスタム HTTP ヘッダーとマネージドプレフィックスリストを併用するのが良いです。
マネージドプレフィックスリスト単体でも、https(443)の通信にしているから問題とならないケースもあると思いますが、基本的にはカスタム HTTP ヘッダーとマネージドプレフィックスリストを併用した方が安心かと思います。
]]>CloudFrontログでHTTP ステータスコードが000のモノをよく見るけど、これはどういった時に発生するのか、無視していいモノなのか分かりませんでしたので、調べましたーという内容になります!
公式ガイドでは、以下の記載があります。
000
。この値は、サーバーがリクエストに応答する前に、ビューワーが接続を閉じたことを示します。サーバーがレスポンスの送信を開始した後にビューワーが接続を閉じた場合、このフィールドには、サーバーが送信を開始したレスポンスの HTTP ステータスコードが含まれます。 標準ログ (アクセスログ) の設定および使用 - Amazon CloudFrontログファイルを使用してオブジェクトに対するユーザーリクエストに関する情報を取得します。
「ビューワーが接続を閉じたこと = ブラウザを閉じた」と考えていいものかという疑問です。
Lambda@Edgeを使ってSleepを入れながら確認した結果、HTTP ステータスコードが000は、ブラウザを閉じた場合など接続が切れた場合に発生することが分かりました!
接続が切れた場合なので、基本的に無視して良い(どうしようも無い)ログということです。
<疑問>
CloudFrontログでHTTP ステータスコードが000のものは何者?
<調査方法>
Lambda@Edgeを使ってSleepを入れながら確認
<調査結果>
ブラウザを閉じた場合など接続が切れた場合に発生する
調査方法の詳細と調査結果を書いていきます!
CloudFrontのオリジンをS3にして作成し、Lambda@Edgeを使ってSleepを入れながら確認しました。
まずは、調査の準備について記載します。
次にSleepを入れるLambda@Edgeを作成します!
以下のものを作成しておきます。
const sleep = (m) => {
return new Promise((resolve) => setTimeout(resolve, m));
};
export const handler = async(event) => {
await sleep(2000);
return event['Records'][0]['cf']['request'];
};
以下のものを作成しておきます。
const sleep = (m) => {
return new Promise((resolve) => setTimeout(resolve, m));
};
export const handler = async(event, context, callback) => {
await sleep(2000);
callback(null, event.Records[0].cf.response);
};
以下のイベントのタイミングで、上記で用意したLambda@Edgeを実行し、Sleepするようにします。Sleepしている間に接続を切ったら、どのようになるか確認していきます。
各イベントの詳細は以下をご参照ください。
ビューワーリクエストに「リクエスト時のLambda@Edge」を設定して、CloudFrontにアクセスし、Sleep中に通信を切断します。
動作確認には「ブラウザ」と「curlコマンド」を使用しました。
HTTP ステータスコード(sc-status):000
x-edge-detailed-result-type:ClientCommError
<実行したコマンド>
curl --max-time 1 {url}
<結果>
HTTP ステータスコード(sc-status):000
x-edge-detailed-result-type:ClientCommError
次はオリジンリクエストです。
オリジンリクエストに「リクエスト時のLambda@Edge」を設定して、CloudFrontにアクセスし、Sleep中に通信を切断します。
HTTP ステータスコード(sc-status):000
x-edge-detailed-result-type:ClientCommError
<実行したコマンド>
curl --max-time 1 {url}
<結果>
HTTP ステータスコード(sc-status):000
x-edge-detailed-result-type:ClientCommError
次は、ビューワーレスポンスです。
ビューワーレスポンスに「レスポンス時のLambda@Edge」を設定して、CloudFrontにアクセスし、Sleep中に通信を切断します。
HTTP ステータスコード(sc-status):000
x-edge-detailed-result-type:ClientCommError
<実行したコマンド>
curl --max-time 1 {url}
<結果>
HTTP ステータスコード(sc-status):000
x-edge-detailed-result-type:ClientCommError
次は、オリジンレスポンスです。
オリジンレスポンスに「レスポンス時のLambda@Edge」を設定して、CloudFrontにアクセスし、Sleep中に通信を切断します。
HTTP ステータスコード(sc-status):000
x-edge-detailed-result-type:ClientCommError
<実行したコマンド>
curl --max-time 1 {url}
<結果>
HTTP ステータスコード(sc-status):000
x-edge-detailed-result-type:ClientCommError
以下のイベントのタイミングで接続を切った場合、結果は同じで、全てのケースで「HTTP ステータスコード000」が発生しました。
HTTP ステータスコード000の正体は、ブラウザの接続が切れたケースという結果となります。
ついでに、オリジンにALBを指定して、接続を切った場合、ALBのログがどうなるかについても調査しました!
CloudFrontの調査と同様Lambda@EdgeでSleepを入れて調査しました。
ログ出力されない
→オリジン(ALB)にリクエストが届いていない
ログ出力されない
→オリジン(ALB)にリクエストが届いていない
HTTP ステータスコード200でログ出力
→ALB自体は正常終了
200
→ALB自体は正常終了
以下の結果となりましたー!
CloudFrontログのHTTP ステータスコード000は何者?の疑問が解消されましたー!
<疑問>
CloudFrontログでHTTP ステータスコードが000のものは何者?
<調査方法>
Lambda@Edgeを使ってSleepを入れながら確認
<調査結果>
ブラウザを閉じた場合など接続が切れた場合に発生する
AWSマネージメントコンソール画面から、S3+CloudFrontでOAC使う方法は以下の記事をご参照ください。
Terraformの基本的な使い方は以下の記事をご参照ください
本記事では「TerraformでCloudFrontからS3へのアクセス制御をOrigin access control settings(OAC)を使って正しく設定する方法」を題材に、実践でTerraformを使う際のポイントを記載しています。色々な環境構築の基礎知識となり、応用可能な情報となります。
まずは、Terraformソースコードを作成していきます。
4つのファイルを使用します。
次に、4つのファイルに記載する内容について記載していきます。
ファイル名:provider.tf
# terraformバージョンを固定
terraform {
required_version = "1.3.9"
}
# AWSプロバイダーの定義
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
#tfstateファイルを管理するS3バケットを定義
terraform {
backend "s3" {
bucket = "{tfstateファイルを管理するS3バケット名}" #バケット名
key = "terraform-test/terraform.tfstate" #tfstateファイルごとに異なる任意の値
region = "ap-northeast-1"
}
}
ファイル名:variables.tf
locals {
s3_bucket_name = {
public = "{作成するバケット名}"
}
}
ファイル名:aws_s3_bucket.tf
# S3バケット作成
resource "aws_s3_bucket" "terraform_develop" {
bucket = local.s3_bucket_name.public
# 削除保護
lifecycle {
prevent_destroy = true
}
}
# バケットポリシー
resource "aws_s3_bucket_policy" "terraform_develop" {
bucket = aws_s3_bucket.terraform_develop.id
policy = data.aws_iam_policy_document.s3_develop_policy.json
}
# CloudFrontからのアクセスのみを許可
data "aws_iam_policy_document" "s3_develop_policy" {
statement {
principals {
type = "Service"
identifiers = ["cloudfront.amazonaws.com"]
}
actions = ["s3:GetObject"]
resources = ["${aws_s3_bucket.terraform_develop.arn}/*"]
condition {
test = "StringEquals"
variable = "aws:SourceArn"
values = [aws_cloudfront_distribution.terraform_develop.arn]
}
}
}
ファイル名:aws_cloudfront_distribution.tf
# OAC作成
resource "aws_cloudfront_origin_access_control" "terraform_develop" {
name = "terraform_develop"
origin_access_control_origin_type = "s3"
signing_behavior = "always"
signing_protocol = "sigv4"
}
# ディストリビューション作成
resource "aws_cloudfront_distribution" "terraform_develop" {
enabled = true
# オリジン設定
origin {
origin_id = aws_s3_bucket.terraform_develop.id
domain_name = aws_s3_bucket.terraform_develop.bucket_regional_domain_name
// OACを設定
origin_access_control_id = aws_cloudfront_origin_access_control.terraform_develop.id
}
# 削除保護
lifecycle {
prevent_destroy = true
}
# ビヘイビア設定
default_cache_behavior {
target_origin_id = aws_s3_bucket.terraform_develop.id
viewer_protocol_policy = "redirect-to-https"
cached_methods = ["GET", "HEAD"]
allowed_methods = ["GET", "HEAD"]
forwarded_values {
query_string = false
headers = []
cookies {
forward = "none"
}
}
}
restrictions {
geo_restriction {
restriction_type = "none"
}
}
viewer_certificate {
cloudfront_default_certificate = true
}
}
Terraformを実行して環境構築していきます!
以下のコマンドを実行していきます。
// tfstateファイルを管理するS3バケット作成
aws s3 mb s3://{tfstateファイルを管理するS3バケット}
//ワークスペースを初期化する
terraform init
// コードフォーマット
terraform fmt
// バリデーション
terraform validate
// 不正なコードを検出
tflint
// 実行計画を確認
terraform plan
// リソース作成
terraform apply
以下の2点確認できればOKです。
Terraformファイル(.tfファイル)での、S3とCloudFrontの設定について、「prevent_destroy」を以下の通り変更します
削除不可の状態(削除保護されている状態)から削除可能に変更後、削除を行うイメージです。
以下のコマンドで作成したリソースを削除します。
terraform apply
terraform destroy
「CloudFrontからS3へのアクセス制御をOrigin access control settings(OAC)を使って正しく設定する」方法を、Terraformの実践的な使い方で記載しました。
色々な環境構築に応用できるかと思います。Terraformの実践的な使い方のポイントを再度あげておきます
最後にCloudFrontのOACに関する公式記事を載せておきます。
OACは現在推奨されている設定なので、S3+CloudFrontでサイト公開する際のスタンダードな方法を記載していくと考えていただければいいと思います。
以下がゴールイメージです。
本記事では、AWSマネージメントコンソール画面から設定をしますが、Terraformを使いたい方は以下の記事をご参照ください
CloudFrontとS3両方の設定が必要となります
まずはS3のバケットを作成します。
任意のバケット名でS3バケットを作成します。(既存のS3を使う場合は、この手順はスキップしてください)
以下の手順でOACの設定を行います。
まず、ディストリビューションを作成し、オリジンの編集からS3に設定するポリシーを取得という流れになります。
既存のディストリビューションをOACに変更する場合は「ディストリビューションの作成」を「オリジンの編集」と読み替えてください。
CloudFront+S3でOACを使う
以下の手順でS3の設定を行います
以下の点が問題なく動作すればOKです。
S3+CloudFrontでサイト公開する際のスタンダードな方法である、OAC(Origin access control settings)についてみてきました。結構簡単でしたねーAWSさん素晴らしいー
↓公式記事のURLを載せておきます↓
S3 + CloudFrontでWEBサイトを公開する場合、htaccessは使えませんが、htaccessの以下のような動作をさせたい場合の対応方法を記載します。
URLの書き換え
Basic認証
対応方法は2つあります。
Lambda@Edgeを使用する
CloudFrontの関数を使用する
本記事ではCloudFrontの関数を使用して、「URL書き換え」や「Basic認証」をする方法を試してみます。
CloudFrontの関数の特徴として以下のようなことが挙げられます。
めっちゃ早いというメリットがあるが、すぐに終わる処理にしか向かないという制約があります。
「URLの書き換え」や「Basic認証」はすぐに終わる処理なので、CloudFront 関数のメリットをうまく生かすことができます。
それでは、CloudFront関数の設定方法を記載していきます!
「URL書き換え」と「Basic認証」で共通する設定方法になります。
「URL書き換え」や「Basic認証」のソースコードは、設定方法の後に記載します。
設定の大まかな流れは以下のようになります。
関数作成
関数を発行し、ディストリビューションのViewer Requestと紐付ける
具体的な設定方法は以下の通りです。
次は、URLの書き換えのソースコードの例を記載します。
「hoge」のパスが来たら「fuga」に書き換える例です。
「https://ドメイン/hoge」のアクセスを「https://ドメイン/fuga」に書き換えるイメージです。
この際、アクセスするパスが変更になるだけで、リダイレクトは発生しません。
function handler(event) {
var request = event.request;
var uri = request.uri;
if (uri.startsWith("/hoge/")) {
request.uri = "/fuga/";
}
return request;
}
リダイレクトさせたい場合は以下をご参照ください
「hoge」のパスが来たら「fuga」にリダイレクトさせる例です。
「https://ドメイン/hoge」のアクセスを「https://ドメイン/fuga」にリダイレクトします。
function handler(event) {
var request = event.request;
var host = request.headers.host.value;
var uri = request.uri;
var redirect_url;
// 「hoge」のパスが来たら「fuga」に書き換える
if (uri.startsWith("/hoge/")) {
redirect_url = `https://${host}/fuga`;
} else {
// 「hoge」のパスはリダイレクトせず、そのままアクセス
return request;
}
// リダイレクト
var response = {
statusCode: 301,
statusDescription: 'Moved Permanently',
headers:
{ "location": { "value": redirect_url } }
}
return response;
}
次は、Basic認証について記載します。
まず認証キーを用意します。
echo -n "{ID}:{パスワード}" | base64
{ID}、{パスワード}の部分は、使用するIDとパスワードに書き換えて実行します。
実行した結果は以下のソースの「{認証キー}」の部分と置き換えます。
function handler(event) {
var request = event.request;
var headers = request.headers;
var authString = "Basic {認証キー}";
if (
typeof headers.authorization === "undefined" ||
headers.authorization.value !== authString
) {
return {
statusCode: 401,
statusDescription: "Unauthorized",
headers: { "www-authenticate": { value: "Basic" } }
};
}
return request;
}
CloudFront 関数を使うと、S3 + CloudFrontで配信している場合でも、htaccessのような「URL書き換え」や「Basic認証」が簡単にできたと思います。
CloudFront 関数はJavaScriptしか使えませんが、JavaScriptは多くの人が使える言語かと思います。そのため、CloudFront 関数の書き方に慣れてしまえば、htaccessより簡単に設定できるかもしれません
↓公式記事のURLも載せときますねー↓
WordPressのコンテンツを静的ページ化し、CloudFrontで配信できるようする!ということをやっていきます。
静的ページ化するところはWordPressのプラグインStaticPressを使用します。
CloudFrontのキャッシュクリアはClear CloudFront Cacheプラグインを使用します。
また、WordPressURLにBasic認証をかけるということもやっていきます!
WordPressのインストールは終わっている前提での記載になりますので、インストールが終わっていない場合は、以下の記事をご参照いただきEC2にWodPressをインストールください。
①WordPressコンテンツを静的ページ化
②静的ページ化をCloudFrontで配信
③WordPressURLにはBasic認証をかける
StaticPress
→静的ページ化で使用
Clear CloudFront Cache
→CloudFrontキャッシュの削除で使用
それでは、StaticPressを使用して、WordPressコンテンツの静的ページ化をしていきます!
以下の手順で静的ページ化します。手順に記載のパスはAMI「WordPress Certified by Bitnami and Automattic」を使用時の例ですので、環境に応じて読み替えてください
ssh -i “{sshキー}” bitnami@{パブリック IPv4 DNS}
/home/bitnami/stack/wordpress/wp-content/plugins/staticpress/includes/class-static_press_admin.php
// 以下のコードを追加する
「if( !($('li:last-child', ul).offset() === void 0) )」を追加する
修正後ソース 312行目辺り
if( !($('li:last-child', ul).offset() === void 0) )//追加
$('html,body').animate({scrollTop: $('li:last-child', ul).offset().top},'slow');
次に、Clear CloudFront Cacheプラグインをインストールして、CloudFrontのキャッシュを簡単にクリアできるようにしておきます!
Clear CloudFront Cacheは、WordPress管理画面からインストール可能です。
インストール方法の詳細は、以下の記事をご参照ください。
WordPressURLはBasic認証をかけましょ!
Basic認証をかけることで、以下のメリットがあります。
Basic認証のかけ方は以下記事をご参照ください
以上で「StaticPressを使ってEC2上のWordPressコンテンツをCloudFront経由で配信」できるようになりましたー
]]>AWS上でWordPressコンテンツを静的ファイルにしてCloudFront+S3で配信したい方向けの記事です。
以下の記事ではStaticPress S3を使用していますが、「StaticPage S3 sync and CloudFront cache clear」を使うともっと簡単にCloudFront+S3で配信できるようになるよーという記事です。
まずはWordPressのインストールです。
以下の記事を参考に簡単にインストールできますので、インストール作業は以下の記事をみて進めてくださいー
プラグインを使用します。代表的なプラグインは以下の2つを紹介します。
この記事の本題は静的ファイル生成後のS3+CloudFrontでの配信についてですので、詳細は省略します。
//IAMポリシーの設定例 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "cloudfront:CreateInvalidation", "s3:ListBucket", "s3:PutObject" ], "Resource": "*" } ] }
WordPressのコンテンツを更新して、静的ページを生成後、S3+CloudFrontに反映したいタイミングで「StaticPage S3 sync and CloudFront cache clear」プラグインの「S3同期 & キャッシュクリア」ボタンを押下します。
これだけで、静的ファイルのS3への同期とCloudFrontのキャッシュクリアが実行され、最新のコンテンツが反映されます。
StaticPage S3 sync and CloudFront cache clear
以下の3つを入力して保存すれば準備完了。
S3のバケット名
静的ファイルの出力先ディレクトリパス
CloudFrontのディストリビューションID
あとは記事を公開・更新したいタイミングで「S3同期 & キャッシュクリア」ボタンを押下します。
WordPressのStaticPressの導入については以下の記事をご参照ください。
StaticPress S3を使用してS3+CloudFrontでコンテンツ配信するケースの導入例
StaticPressを使用してEC2+CloudFrontでコンテンツ配信するケースの導入例
CloudFrontのキャッシュを削除することで、更新内容がすぐに更新されます。
対応方法には、以下の2つがあります。
WordPressのプラグインを使用する方法
AWSコンソール画面から対応する方法
それぞれの対応方法について、紹介していきます。
簡単に削除したい場合はプラグインを使用する方法がオススメです。
WordPressプラグインClear CloudFront Cacheを使用することで簡単にキャッシュクリア可能です。簡単にインストール・設定できて、かつ、セキュアなプラグインです。導入方法は以下の記事をご参照ください。
AWSのコンソール画面から削除できます。以下の記事を参考にさせて頂き、削除できます。
CloudFrontを使用している場合、CloudFrontがサイトの内容をキャッシュします。
これによってサイトの表示が高速化されるというメリットがあります。
ただし、WordPressで記事を更新した際には、このキャッシュを削除しないと、更新した内容がサイトに即時反映されないという現象が発生することとなります。
上記の方法でキャッシュを削除することで、最新の内容を即時公開できるようになります。
CloudFrontを使用している場合のサイトが更新されない原因と対応方法について、記載しました!
更新されない原因
→CloudFrontがサイトの内容をキャッシュしているため、キャッシュを削除する必要がある
キャッシュを削除には、2つの対応方法がある
WordPressのプラグインを使用する方法
AWSコンソール画面から対応する方法
WordPressのStaticPress S3の導入については以下の記事をご参照ください。
本記事は上記の構築をした後など、StaticPress S3プラグインを使ってS3+CloudFrontでWordPressコンテンツ配信時に、固定記事などが表示されない場合の対処法を記載します。
固定記事は
{固定記事名}/index.html
上記の形式でS3に転送されます。
しかし、固定記事のリンクURLは
{固定記事名}/
となります。
「index.html」がリンクURLにないため表示されないため、
S3上でファイルが見つからず403エラーとなっています。
StaticPressのPHPプログラムを修正する方法もありますが、今回は、CloudFrontの関数を使用して、URLの書き換えを行います。
せっかくCloudFrontで配信してるのだから、CloudFrontの便利機能を使っちゃおうという考えです。
AWSコンソール画面からCloudFrontの関数の作成をします。
以下のように、AWSマネージメントコンソール画面を操作し、CloudFrontの関数作成画面にいきます。
CloudFont->関数->関数を作成
以下の設定でCloudFrontの関数を作成します。
function handler(event) {
var request = event.request
var uri = request.uri;
if (uri.endsWith('/')) {
request.uri += 'index.html';
} else if (!uri.includes('.')) {
request.uri += '/index.html';
}
return request;
}
関数を保存後に、発行タブから「関数を発行」ボタンを押します。
関数を発行後に、発行タブにある「関連付けを追加」ボタンを押下します。
ディストリビューション:CloudFrontのディストリビューションを指定
イベントタイプ:Viewer Request
キャッシュビヘイビア:環境にあったものを選択(特別な設定をしていなければ、Defaultを選択)
上記設定後に「関連付けを追加」ボタンを押下して、実際に関数とCloudFrontの紐付けを行います。
固定記事等の403エラーが発生していたリンクを押下し、ページが表示されればOKです。
StaticPress使用時の403エラーが簡単に解決できたとおもいます。
CloudFrontの関数、便利ですね。
CloudFrontの関数については以下の記事も参考になるかと思いますので、よろしければご覧ください。
AWS S3 + CloudFrontでhtaccessのような「URL書き換え」や「Basic認証」をする方法
CloudFront関数の公式記事も載せておきます!!
WordPressのStaticPressの導入については以下の記事をご参照ください!
StaticPress S3を使用してS3+CloudFrontでコンテンツ配信するケースの導入例
StaticPressを使用してEC2+CloudFrontでコンテンツ配信するケースの導入例
本記事はStaticPressを導入後に、不要な静的ファイルが出力されないようにする方法を記載します。
不要な静的ファイルとは配信サーバに不要なページであるWordPressの管理画面などのHTMLを指します。
不要なファイルを生成されないようにすることで、以下のメリットがあります。
ディスク容量の削減
StaticPressでの再構築時間の短縮
配信サーバに不要なページについて、具体的には以下のフォルダを不要と考えています。
改めて、不要なページを出力しないようにする理由について、記載していきます。
配信に不要なページについて、静的HTMLを出力しないようにすることで、以下のメリットがあります。
<WordPressサーバ(EC2)からみたメリット>
メリット1:EC2ディスク容量の節約できる
メリット2:再構築(HTML生成)時間の短縮
<配信サーバ(S3)からみたメリット>
※WordPressサーバ(EC2)で配信している場合は対象外です。配信サーバにS3を使用している場合、以下のようになります。
WordPressサーバで不要なページについては静的ファイル(HTMLファイル)の生成対象外となるため、StaticPress S3でS3に同期(コピー)対象から不要なページが含まれないようになります。これにより以下のメリットがあります
メリット1:S3 APIの節約に役立ちます
メリット2:S3 ストレージの節約に役立ちます
それでは、不要な静的ファイルが生成されないようにする方法を記載します。
生成対象外とする対象のフォルダによって対応方法が異なります。
まずは、wp-admin、wp-includesフォルダを除外する方法を記載します。
修正対象ソース:/wp-content/plugins/staticpress/includes/class-static_press.php
869行目辺りを以下のように修正する
//修正後ソース
//869行目辺り
private function static_files_url($url_type = 'static_file'){
$urls = array();
$static_files_filter = apply_filters('StaticPress::static_files_filter', $this->static_files_ext);
foreach ($static_files_filter as &$file_ext) {
$file_ext = '*.'.$file_ext;
}
$static_files = array_merge(
$this->scan_file(trailingslashit(ABSPATH), '{'.implode(',',$static_files_filter).'}', false),
//$this->scan_file(trailingslashit(ABSPATH).'wp-admin/', '{'.implode(',',$static_files_filter).'}', true),←コメントアウト
//$this->scan_file(trailingslashit(ABSPATH).'wp-includes/', '{'.implode(',',$static_files_filter).'}', true),←コメントアウト
$this->scan_file(trailingslashit(WP_CONTENT_DIR), '{'.implode(',',$static_files_filter).'}', true)
);
次に、以下の静的ファイルを生成されないように対応します。
・/wp-content/plugins/*
・/wp-json/*
・/author/*
修正対象ソース:/wp-content/plugins/staticpress/plugin.php
//以下のソースを追加
add_action('StaticPress::file_put', 'static_rm', 1, 2);
function static_rm($file_dest, $url){
if(strstr($file_dest, '/author/')
or strstr($file_dest, '/wp-content/plugins/')
or strstr($file_dest, '/wp-json/')){
unlink($file_dest);
}
}
以下の対応をした後にStaticPressで再構築をします。
WordPressサーバの静的ファイル出力フォルダをカラにする
(S3を使用している場合)S3にコピーされたファイルを全て削除する
StaticPressで再構築後に以下の確認ができればOKです。
WordPressサーバの静的ファイル出力フォルダにファイルが出力されている
配信用URLにアクセスし、サイトが正常に表示される