RewriteCond RewriteRuleの書き方
Tag:Web
参考
htaccess tester
.htaccess 使い方 RewriteCond 書式 変数名 一覧 – ネットワークサービス 設定
RewriteRuleディレクティブ:URLのリライト/リダイレクトを行う
説明
RewriteCond 判定
RewriteCond 判定
RewriteCond 判定
RewriteRule 一致した場合のURL置換ルール
リダイレクトとリライト
リライトはブラウザのアドレスバーのURLは元のまま、参照先のみが変わる
1 2 3 4 5 6 7 8 |
# リライト RewriteRule ^index\.html$ /new/index.html # リダイレクト RewriteRule ^index\.html$ /new/index.html [R=301] # リダイレクト(別のドメインの場合) RewriteRule ^index\.html$ http://www.example.com/ |
書き方
RewriteCond [対象] [判定] (オプション)
RewriteRule [対象2] [結果] (オプション)
対象2の値
通常
https://test.com/new/4/?time=986
VirtualHost ディレクティブ内の場合
https://test.com/new/4/?time=986
.htaccessがサブディレクトリ内の場合(blog内)
https://test.com/blog/new/4/?time=986
変数
変数名 %{○○} | 意味 | 値の例 |
HTTP_USER_AGENT | ユーザーエージェント | |
HTTP_REFERER | 参照元URL | |
HTTP_COOKIE | クッキー情報 | |
HTTP_FORWARDED | プロキシ情報 | |
HTTP_HOST | サーバーのホスト名 | test.com |
HTTP_PROXY_CONNECTION | プロキシを経由しているか否か | |
HTTP_ACCEPT | ブラウザの言語タイプ | |
DOCUMENT_ROOT | ドキュメントルートのパス | |
SERVER_ADMIN | サーバー管理者情報 | |
SERVER_NAME | サーバー名 | |
SERVER_ADDR | サーバーのアドレス | |
SERVER_PORT | サーバーのポート番号 | |
SERVER_PROTOCOL | プロトコルバージョン | |
プロトコルバージョン | サーバーソフトウェア | |
REMOTE_ADDR | リモートアドレス | |
REMOTE_HOST | リモートホスト名 | |
REMOTE_USER | リモートユーザー名 (基本認証利用時) | |
REMOTE_IDENT | リモートユーザーのID | |
REQUEST_METHOD | リクエストメソッド | |
SCRIPT_FILENAME | スクリプトファイル名 | |
PATH_INFO | パス情報 | |
QUERY_STRING | クエリ文字列 | time=986 |
AUTH_TYPE | 認証タイプ | |
TIME_YEAR | 年 | 2021 |
TIME_MON | 月 | 07 |
TIME_DAY | 日 | 29 |
TIME_HOUR | 時 | 08 |
TIME_MIN | 分 | 15 |
TIME_SEC | 秒 | 28 |
TIME_WDAY | 曜日 (0:日 ~ 6:土) | 4 |
TIME | 年月日時分秒 (例:20130123123456) | 20210729071358 |
API_VERSION | APIバージョン | |
THE_REQUEST | リクエスト文字列 | |
REQUEST_URI | リクエストURI | new/4/?time=986 |
REQUEST_FILENAME | リクエストされたファイル名 | |
IS_SUBREQ | サブリクエストか否か | |
HTTPS | HTTPSでのアクセスか否か | on / off |
RewriteCond 条件パターン
パターン | 意味 | 使用例 |
正規表現 | ()で括った部分はRewriteRuleで%1で参照できる | (ab).+ |
! | 否定 | !(ab|cd) |
< | テスト文字列より上の場合true | <67 |
> | テスト文字列より下の場合true | >3 |
= | テスト文字列と等しい場合true | |
<= | テスト文字列以上の場合true | |
>= | テスト文字列以下の場合true | |
-d | ディレクトリが存在すればtrue | -d |
-f | ファイルが存在すればtrue | -f |
-eq | 「=」と同義 | |
-ge | 「<=」と同義 | |
-gt | 「<」と同義 | |
-le | 「>=」と同義 | |
-lt | 「>」と同義 | |
-F | (is existing file, via subrequest)アクセス可能な有効なパスを指している場合にtrue (内部サブリクエストを用いてcheckされる) | |
-l | (is symbolic link)シンボルリンク(-H、-Lも同じ意味。ちなみに小文字エルです) | |
-s | (is regular file, with size)ファイルが存在し、サイズが0でなければtrue | |
-U | (is existing URL, via subrequest)アクセス可能な有効なURLとなっている場合にtrue | |
-x | (has executable permissions)実行権限がある場合にtrue |
オプション
RewriteCondでの判定結果を使う「%1」
RewriteRuleでの判定結果を使う「$1」
記載例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# httpsにリダイレクト RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L] # wwwにリダイレクト RewriteCond %{HTTP_HOST} ^(?!www\.).+$ RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] # www無しにリダイレクト RewriteCond %{HTTP_HOST} ^www\.(.+)$ RewriteRule ^(.*)$ https://%1/$1 [R=301,L] #全てのアクセスを別ドメインの同じパスへリダイレクト RewriteRule ^ https://new.net/%{REQUEST_URI} [R=301,L] #全てのアクセスを別ドメインのトップへリダイレクト RewriteRule ^ https://new.net/ [R=301,L] #https://old.net/aaa → https://new.net に下層を残して転送 RewriteCond %{REQUEST_URI} ^/aaa(.*)$ RewriteRule ^ https://new.net%1 [R=301,L] |