Nginx上のWordPressのパーマリンクをデフォルト以外に対応させる。

  • このエントリーをはてなブックマークに追加

WordPressのパーマリンクを”blog.jo3qma.com/?p=123″のような形から”blog.jo3qma.com/year/month/postname”のような形に変更したいと思ったので、設定を変えました。
しかし、記事やカテゴリーページで404 Not Foundを吐くみたいなので、調べて対応してみました。

参考

 

設定を変更する

どうやら、Nginx + php-fpmのような構成では、Nginx側で処理をしたものを、php-fpmに渡してあげないといけないようです。
また、ただ単にphpを動かすような簡易的な設定にしたのも行けなかったようです。

/etc/nginx/ 以下の適当なconfを編集。

server {
  listen 80;
  listen [::]:80;
  server_name blog.example.com;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name blog.example.com;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  include servers/letsencrypt.conf;
  root root_directory/hoge;
  location / {
    index index.html index.htm index.php;
  }
  include servers/php.conf;
}

上記の設定から以下のことをし、解決させました。

大体、WP Codexの設定丸パクリ

  • indexディレクティブの、.html.htmを消す。
  • すべての条件に失敗した際のtry_filesディレクティブを設定(これ)
  • jsやらcssやら画像やらの404エラーログをオフにする設定
  • php-fpmへ転送する項目の再設定

まあ、最初からちゃんと調べて設定しておけば困らなかった話ですね。。。

 

ということで、解決後の設定。

server {
  listen 80;
  listen [::]:80;
  server_name blog.example.com;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  client_max_body_size 20M;
  server_name blog.example.com;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  include servers/letsencrypt.conf;
  root /srv/http/blog.example.com;
  index index.php;

  #全て失敗した際
  location  / {
    try_files $uri $uri/ /index.php$args;
  }

  # */wp-admin へのリクエスト末尾にスラッシュを追加します。
  rewrite /wp-admin$ $scheme://$host$uri/ permanent;

  # Expiresヘッダを送り、404エラーログをオフにするディレクティブ。
  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 24h;
    log_not_found off;
  }

  # すべてのPHPファイルを php-fpm/php-fcgi サーバーに送ります。
  location ~ \.php$ {
    try_files $uri =404;

    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    include fastcgi_params;
    fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
    include        fastcgi.conf;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_intercept_errors on;
  }
  # 40x
  error_page 404 /404.html;
  location = /40x.html {
  }
  # 50x
  error_page  500 502 503 504 /50x.html;
  location = /50x.html {
  }
}

おしまい

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す