TECHBLOG

WordPress > .htaccess

WordPressの.htaccess

Create:

Update:

Category:WordPress.htaccess

[ Version.19 ]

概要

WordPressインストール時に .htaccess は自動で設置されますが、整形した上で管理しています。

.htaccess
# wp-base
	RewriteEngine On
	RewriteBase /
# ssl
	RewriteCond %{HTTPS} !on
	RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# index.php
	RewriteRule ^index\.php$ - [L]
# wepp
	RewriteCond %{HTTP_ACCEPT} image/webp
	RewriteCond %{REQUEST_FILENAME} (.*)\.(jpe?g|png|gif)$
	RewriteCond %{REQUEST_FILENAME}.webp -f
	RewriteCond %{QUERY_STRING} !type=original
	RewriteRule (.+)\.(jpe?g|png|gif)$ %{REQUEST_URI}.webp [T=image/webp,L]
	<FilesMatch "\.(jpe?g|png|gif)$">
		Header append Vary Accept
	</FilesMatch>
	AddType image/webp .webp
# wp-admin
	RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
	RewriteRule ^wp-admin/$ xx/wp-admin/ [R=301,L]
# file_exist / dir_exist
	RewriteCond %{REQUEST_FILENAME} -f [OR]
	RewriteCond %{REQUEST_FILENAME} -d
	RewriteRule ^ - [L]
# redirect
	# with_query
	RewriteCond %{QUERY_STRING} (^|&)h=777(&|$)
	RewriteRule ^xxx/aaa001\.php$ yyy/zzz/? [R=301,L]
	# normal
	RewriteRule ^item/test142\.php$ item/redirectto/ [R=301,L]
# for multisite
	# RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) xx/$2 [L]
	# RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ xx/$2 [L]
# [*] > index.php
	RewriteRule . index.php [L]

.htaccess について

サーバーにはそれぞれ固有の設定がありますが、.htaccess はその設定を設置ディレクトリ以下に対して変更するものです。

※ 一部語弊があるかもしれません。

IfModule などサーバーに入っていることは分かっているので書いていません。

コード解説

#が接頭にある行はコメントです。

正規表現については割愛します。

先頭にタブ(\t)を記述しても問題ありません。

wp-base
RewriteEngine On
RewriteBase /

mod rewrite(RewriteEngine) を On にします。※ ほとんどのサーバーで使用できますので、分岐はまず不要です。

RewriteBase は、RewriteRuleの移動先(第2引数)で指定されたパスに prefix されます。

※ 空は許可されません。

※ 特定ディレクトリ内にインストールする場合、ここは /*dirname/ にします。

ssl
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond は「if」のようなものです。

「https://」で始まらないURLの場合

RewriteRule は 第1引数(スペースで区切られたひとつめ)の正規表現にマッチしたものを 第2引数にします。

ここでは、http:// をhttps:// に変更しています。

[R=301,L] は、リダイレクト301(永久、他に302=一時)で最後(L)だと書かれています。

[R=301,L]が記述されている場合、「リダイレクトされ、htaccess1行目からやり直す」とイメージすれば挙動が分かりやすいと思います。

index.php
RewriteRule ^index\.php$ - [L]

index.php でURLが終わっていれば、index.phpは省略。

wepp
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{REQUEST_FILENAME} (.*)\.(jpe?g|png|gif)$
RewriteCond %{REQUEST_FILENAME}.webp -f
RewriteCond %{QUERY_STRING} !type=original
RewriteRule (.+)\.(jpe?g|png|gif)$ %{REQUEST_URI}.webp [T=image/webp,L]
<IfModule mod_headers.c>
	<FilesMatch "\.(jpe?g|png|gif)$">
		Header append Vary Accept
	</FilesMatch>
</IfModule>
AddType image/webp .webp

RewriteCond はデフォルトで「&」です

  1. webpに対応していれば
  2. 拡張子が jpe?g|png|gif のどれかであれば
  3. パスに.webpを付記したwebpファイルが存在していれば
  4. (結果)webpを表示

ちなみにWebPはWordPress標準初期設定で生成されます。

wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteRule ^wp-admin/$ xx/wp-admin/ [R=301,L]

wp-adminの後ろに「/」がついていなければ付記。

xxはWordPress本体のディレクトリです。2行目は、wp-admin とURLに足すだけで、管理画面にアクセスできるようにしていますが、蛇足かもしれません。

file_exist / dir_exist
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

[OR] はそのまま、条件のORです。

  1. ファイルがあれば
  2. ディレクトリがあれば
  3. (結果)そちらを参照
redirect
# with_query
RewriteCond %{QUERY_STRING} (^|&)h=777(&|$)
RewriteRule ^xxx/aaa001\.php$ yyy/zzz/? [R=301,L]
# normal
RewriteRule ^item/test142\.php$ item/redirectto/ [R=301,L]

ここにリダイレクトを記述します。上記の例ではパラメータ付きのURLリダイレクトとノーマルなリダイレクトの両方をサンプルで記述しています。

for multisite
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) xx/$2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ xx/$2 [L]

マルチサイトの場合は、このコメントを外します。

[L] で301や302のリダイレクトがない場合はURLに変更はなく、そのままのURLで異なるファイルを参照しているイメージです。

/ブログ名/wp-admin/でアクセスした場合、/wp-admin/ の本体を参照するようにします。

[*] > index.php
RewriteRule . index.php [L]

上記の条件を通過した場合は、全て index.php にアクセス。

※ WordPress 覚えたての頃、index.php にアクセスが集中するが大丈夫なのかと疑問に思っていました。

loading