【nginx】WordPress 用のパーマリンク設定を修正しました♪

スポンサードリンク

追記。次の投稿で、一部 nginx 設定ファイルを修正しております。

ポイント

  • nginx ウェブサーバ設定の server コンテキストに try_files $uri $uri/ /index.php?q=$uri&$args; を記述する

try_files $uri $uri/ /index.php?q=$uri&$args; の意味

ある条件の URL の場合に rewrite を使って URL を書き換えることができますけれども、try_files を使用することで条件の判定と、URL の書き換えができますの♪

記述する設定の量も減って、見やすくなって、よいですわね♪

  • try_files
  • パラメータとして指定されたファイルの存 在を確認する。指定されたファイルが見つ からなかった場合、最後のエントリが代替 として使用されるため、最後に指定したパ スもしくは名前付きロケーションは必ず存 在するようにしておくこと
  • コンテキスト server, location

try_files はパラメーターで指定された順にファイルがあるか存在をチェックして最初に存在したファイルを参照いたします。

なければ、最後のパラメーターが使われるため、必ず存在させる必要がありますわ。

なお、server コンテキストでも 用いられますが、try_files は通常 location 内で用いられるそうですの。わたくしたちは、server コンテキストで使用しております。問題は起きておりませんの♪

さて、try_files $uri $uri/ /index.php?q=$uri&$args; ですけれども、以上を踏まえますと次のようになりますわ。

  • $uri → $uri/ が存在するかをチェック。なければ、/index.php?q=$uri&$args を使用する。
  • $uri URLのホスト名以降(パラメータ情報を除く)。$uri 変数の値はスラッシュ(/)から始まるので、先頭にスラッシュを指定する必 要はない。
  • $args URLに指定されたパラメータ情報

/etc/nginx/conf.d/default.conf の修正内容

WordPress の設定内容は、/etc/nginx/nginx.conf ではなく、/etc/nginx/conf.d/default.conf に記述しております。今回の修正部分は次となりますの。

# 実ファイルがない場合のアクセスファイル
try_files $uri $uri/ /index.php;

location / {
    # WordPress パーマリンク設定を利用可能にする
    if (!-e $request_filename) {
        rewrite ^.+?(/wp-.*) $1 last;
        rewrite ^.+?(/.*\.php)$ $1 last;
        # ドキュメントルートから WordPress までの相対パス
        # (ドキュメントルートにインストールしたため相対パスは記入なし)
        rewrite ^ /index.php last;
    }
}

# WordPress カスタム パーマネントリンク対応
try_files $uri $uri/ /index.php?q=$uri&$args;

その結果、/etc/nginx/conf.d/default.conf の全体は次のようになりました♪

# ドキュメントルート
root   /var/www/html/oki2a24.com;
# インデックスファイル指定
index  index.php index.html index.htm;

# キャッシュしたファイルが保管されるパスと、キャッシュゾーンの名前、容量を指定
# キャッシュ保管場所 /var/cache/nginx
# キャッシュを保存するサブディレクトリ階層の深さ 1:2
# キャッシュゾーン czone メモリの割当量 32m
# ゾーン内に保存できるキャッシュ最大値 256m
# アクセスの無いキャッシュを削除するまでの期間 1440m
proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=czone:32m max_size=256m inactive=1440m;
# 利用するキャッシュゾーンの名前を指定
proxy_cache czone;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# ステータスコードが通常応答の「200」と、ファイルが存在しない「404」の場合30分間キャッシュを保持
proxy_cache_valid 200 404 30m;

# プロキシサーバ設定
server {
    listen 80 default_server;

    # ドットファイルへのアクセスを禁止、ログへの記録オフ
    location ~ /\. {deny all; access_log off; log_not_found off; }
    # robots.txt へのアクセスはログへの記録オフ
    location = /robots.txt  { access_log off; log_not_found off; }
    # favicon へのアクセスはログへの記録オフ
    location = /favicon.ico { access_log off; log_not_found off; }
    # JavaScript CSS 画像へのアクセスはログへの記録オフ、直ちにプロキシに通しキャッシュ。
    # この期の設定でアクセス元の状態で複数キャッシュを行うが画像ファイルなどは複数キャッシュさせない
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        log_not_found off;
        proxy_pass http://unix:/var/run/nginx.sock;
    }

    # プロキシキャッシュ設定
    # 初期値はキャッシュするにセット
    set $do_not_cache 0;
    # .php ファイルへ直接アクセスがあるのは基本的に管理ページのみのためキャッシュしない
    if ($uri ~* "\.php$") {
        set $do_not_cache 1;
    }

    # POST 時はキャッシュしない
    if ($request_method = POST) {
        set $do_not_cache 1;
    }

    # $proxy_cache_key に任意の文字を加えることで別のキーでページをキャッシュ可能にする
    set $proxy_cache_key "$scheme://$host$request_uri";

    # ログイン状態またはコメントを記入したことがあれば、その情報ごとにキャッシュを分ける
    if ($http_cookie ~ "(wordpress_logged_in_|comment_author_)(.*)") {
        set $proxy_cache_key "$2::$proxy_cache_key";
    }

    # 今まで組み立てたプロキシ設定でキャッシュを実行
    location / {
        proxy_no_cache $do_not_cache;
        proxy_cache_bypass $do_not_cache;
        proxy_cache_key $proxy_cache_key;
        proxy_pass http://unix:/var/run/nginx.sock;
    }
 
}

# ウェブサーバ設定
server {
    # ポートを指定
    #listen       80;
    listen unix:/var/run/nginx.sock; 
    # WordPress カスタム パーマネントリンク対応
    try_files $uri $uri/ /index.php?q=$uri&$args;

    # PHP-FPM 設定
    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_pass_header "X-Accel-Redirect";
        fastcgi_pass_header "X-Accel-Buffering";
        fastcgi_pass_header "X-Accel-Charset";
        fastcgi_pass_header "X-Accel-Expires";
        fastcgi_pass_header "X-Accel-Limit-Rate";
    }
}

おまけ。Apache での WordPress のパーマリンク設定用 .htaccess 内容の確認

WordPress は Apache で動作することが前提ですけれども、そのときのパーマリンク設定は .htaccess ファイルに記述されておりました。その内容はどんなものであったのか、確認いたしましょうか。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
  • 5行目の RewriteRule → ファイル名が index.php ならばそのまま処理を続行
  • 6 〜 8 行目の RewriteCond、RewriteRule → ファイルやディレクトリが存在しなければ、/index.php を処理

おわりに

次のページが大変参考になりました。nginx で WordPress を動かすときは、設定を具体的にどのように変更すればよいか、また、今後なにを変更するのがおすすめか、わかりやすく説明されています。ありがとう存じます!

また、次の本で確証を得たり、nginx の全体像も含めて勉強しております。お勧めですの♪

今回の修正に関して、特に勉強になった部分を引用いたします。

P24 try_filesディレクティブについて、ひと言補足しておきます。これはserverコンテキストでも用いられますが、通常ロケーション内で用いられます。

P57 try_filesディレクティブ(httpコアモジュールに含まれています)は、その名のとおりファイルの存在を順に確認します。

P192 (URIの存在を確認するためには、ifを用いる)この設定は行わないでください。インターネット上では、これを推奨している設定を見ることがあるかもしれませんが、それらは過去の遺物かその複製です。リライトルールに限りませんが、try_filesディレクティブはhttpモジュールのcoreに含まれており、それはこの種の処理のために作られたものなので、より効率的です。

以上です。


スポンサードリンク