質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

Q&A

解決済

1回答

487閲覧

リダイレクト時の特殊記号について

kjshdfiuasye

総合スコア29

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

0グッド

0クリップ

投稿2024/08/01 04:25

編集2024/08/08 08:26

実現したいこと

htaccessでリダイレクトしたいです。

発生している問題・分からないこと

質問1

「RewriteRule [A] [B]」のBに入るURL指定でドット記号のエスケープは不要なのか?

解説サイト0を見るとドット記号はエスケープが必要なようである。しかし「RewriteRule [A] [B]」のBに入るURL指定でドットをエスケープしていない解説サイトしか見たことがなく、B部分は正規表現の記号を使える部分なのにドット記号のエスケープは不要なのか疑問に思った。NEフラグがついていない構文に関してはドットがエンコードがされる為ドットはエスケープ不要なのかと思ったが情報が見つからなかった。

質問2

RewriteRuleでの%1(後方参照)を使う時にNEフラグをつけなくていいのか?

解説サイト1を見ると「NEフラグ=".", "?", "%"などの特殊文字が"%25″のようにエンコードされるのを防ぐ」とある。%1など後方参照を行うには、NEフラグ無しだと%がエンコードされてしまうと思い、NEフラグをつけるのかと思いきやそうしていない構文が記載された解説サイト2があった。

該当のソースコード

apache

1RewriteEngine on 2RewriteCond %{HTTPS} off 3RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 4RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] 5RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,L]

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

「RewriteRule エスケープ」「正規表現 エスケープ」と調べ、特殊な意味の記号を使う時には、NEフラグをつけたりエスケープが必要だと解釈したが、実際のhtaccessの構文を調べてみるとエスケープしたりNEフラグをつけていないサイトがあった為、混乱してしまった。

補足

apacheのドキュメント抜粋
↑引用元=https://httpd.apache.org/docs/2.4/rewrite/intro.html

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問1:

RewriteRule [A] [B]

のAは正規表現ですが、Bは正規表現ではありません。参考にされたページは正規表現の書き方の解説なのでBには何の関係もありません。

質問2:
記号が%エンコードされるのは、リライトの構文での置換を行った後です。これはあまりブログなどでの解説記事には明示的に書かれていないかも知れません。
公式リファレンス https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriterule
NE の説明では、

Prevent mod_rewrite from applying hexcode escaping of special characters in the result of rewrites that result in redirection.

ということから、
・リダイレクト限定
・書き換えの結果に対してのエスケープ
と分かります。

つまり、$1%1%{HTTP_HOST}などの置換を行ったあとで、リダイレクトのURLに特定の記号が残っていれば、それは%エンコードされるということです。
お書きの例だと%1%{REQUEST_URI} %はこの機能には関係ありません。

投稿2024/08/01 11:01

編集2024/08/01 11:13
otn

総合スコア85929

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2024/08/01 11:11

本題とは関係ないですが、R=301 と恒久リダイレクト(=ブラウザにキャッシュする)にしちゃってるので、Rewite~~を書き換えたらそれを反映するためにはブラウザのキャッシュクリアーが必要(かもしれない)ことは認識されていますか?
kjshdfiuasye

2024/08/02 01:05

ご回答ありがとうございます。大変為になりました。コメントの件については認識しておりませんでした。これを回避するにはR=301フラグの利用を取りやめるしか無いのでしょうか。
otn

2024/08/02 09:59

> これを回避するにはR=301フラグの利用を取りやめるしか無いのでしょうか。 そうですね。リダイレクトのテスト中は、R だけ (R=302と同じ意味)にしておいて、「恒久的にその設定は変更しない」という状態になったら、R=301に変更しても良いし、両者の違いを理解した上でそのままでもいいです。 「R=301 R=302 違い」とかで検索してみて下さい。 あとで気づいたのですが、「.htaccessを即時反映させる方法」https://teratail.com/questions/a3qtrcmlqecyuf と同じ人ですね。 .htaccess自体はHTTPリクエストがあると毎回読まれますが、.htaccessの設定でブラウザに対して「この件はいついつまでウラウザ側でキャッシュして欲しい」と依頼したものは、ブラウザが再度サーバーにリクエストすることなしに(なので.htaccessは読まれない)、指示された期限までキャッシュを優先する可能性があります。R=301だと「無期限キャッシュ」ですね。まあ、キャッシュサイズが上限になったらいずれ消えるでしょうけど。
otn

2024/08/08 15:30 編集

普通のリダイレクトは [R] ですね。[R=302]とステータスコードを明記しても良いけど。 [R=404]とかも可能と言えば可能です。 R=301 と R=302 は意味が違うので、「いつもこっちを使う」というのは間違いで、状況に応じて適切な方を使います。
kjshdfiuasye

2024/08/08 08:33

ご返信ありがとうございます。 RewriteCond [A] [B]のBは正規表現ですよね?質問文の見出し「補足」に記述された構文(apacheの公式ドキュメント)では RewriteCond %{HTTP_HOST} ^(admin.example.com)$ という箇所があり、なぜドットをエスケープしていないのでしょうか。これだとドット部分が他の一文字の場合(admin-example.com等)にもマッチしてしまいますよね?レンタルサーバーの公式ドキュメントでもRewriteCondのB部分でドットをエスケープしないリダイレクト方法の案内があり問い合わせたところ誤りだったと回答がありました。公式がこれだと何を信じていいのやらという感じです。
otn

2024/08/08 09:51

> なぜドットをエスケープしていないのでしょうか。 実害が無いからでしょう。 「admin.example.com 以外に、adminXexample.com などのドメインを取得していて、どちらも同じこのサーバーのIPアドレスをDNS登録してある」というケースでは問題になるかもしれませんが、普通はそんなことは無い。 それより、「ホスト名は英大文字小文字を区別しない」が正しいので、[NC]オプションを付けないといけません。そっちは実害ある。 > レンタルサーバーの公式ドキュメントでも 企業の場合はサポートの負荷も考えないといけません。 \ なしだとホスト名はコピペで良いのですが、\ を付けるならコピペのあと手作業で \ を付ける必要があります。ここでタイプミスしてミスに気づかず「うまく行かない」という問い合わせが来るのはいやですね。 (エディターなどで . を \. に置換してからペーストするなどは初心者はしません) 正規表現を使わないで、 ewriteCond %{HTTP_HOST} =admin.example.com [NC] とガイドするのも良いかもしれませんが、そうすると「=文字列」というのが、リライトの事例であまり見かけないので、また問い合わせが来そう。 レンタルサーバー会社のドキュメントじゃなくて、個人ブログとかで「Apacheでのリライト・リダイレクトの仕方」のような記事の場合だと、「\が抜けてますよ」とコメントを入れてあげましょう。
kjshdfiuasye

2024/08/09 01:12

ご回答ありがとうございます。 ・実害が無いから ・NCオプション必要 ・問い合わせ負荷削減のため ・個人ブログならコメントで指示 とのこと、承知しました。追加の質問にまでご対応くださり心より御礼申し上げます。大変為になりました。ありがとうございます。
otn

2024/08/09 02:46

> ・問い合わせ負荷削減のため は、当事者(その会社の人)じゃないので、あくまで想像ですけどね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問