WEBLOG
WordPress > .htaccess
WordPressインストール時に .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 はその設定を設置ディレクトリ以下に対して変更するものです。
※ 一部語弊があるかもしれません。
IfModule などサーバーに入っていることは分かっているので書いていません。
#が接頭にある行はコメントです。
正規表現については割愛します。
先頭にタブ(\t)を記述しても問題ありません。
RewriteEngine On
RewriteBase /
mod rewrite(RewriteEngine) を On にします。※ ほとんどのサーバーで使用できますので、分岐はまず不要です。
RewriteBase は、RewriteRuleの移動先(第2引数)で指定されたパスに prefix されます。
※ 空は許可されません。
※ 特定ディレクトリ内にインストールする場合、ここは /*dirname/ にします。
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行目からやり直す」とイメージすれば挙動が分かりやすいと思います。
RewriteRule ^index\.php$ - [L]
index.php でURLが終わっていれば、index.phpは省略。
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 はデフォルトで「&」です
ちなみにWebPはWordPress標準初期設定で生成されます。
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に足すだけで、管理画面にアクセスできるようにしていますが、蛇足かもしれません。
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
[OR] はそのまま、条件のORです。
# 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リダイレクトとノーマルなリダイレクトの両方をサンプルで記述しています。
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/ の本体を参照するようにします。
RewriteRule . index.php [L]
上記の条件を通過した場合は、全て index.php にアクセス。
※ WordPress 覚えたての頃、index.php にアクセスが集中するが大丈夫なのかと疑問に思っていました。