htaccessで「if else」のような動き(特定ページ以外はトップへリダイレクト)


Webサイトリニューアルに伴いリダイレクト処理を施しているのですが、特定のページは対応したページへリダイレクトさせる必要があります。

例:
http://hogehoge.com/hoge.html

http://hogehoge.com/geho/

実際の記述
RewriteEngine on
RewriteBase /
RewriteRule hoge\.html geho [R=301,L]

その後、「それ以外のページはすべてトップページへリダイレクトさせる」という処理を入れたいのですが、どのように記述するのが正しいでしょうか。
例:
http://hogehoge.com/geho.html
http://hogehoge.com/gehogeho.html
http://hogehoge.com/gehogehogeho.html
……

http://hogehoge.com

よろしくお願いいたします。

回答の条件
  • 1人50回まで
  • 登録:
  • 終了:2018/03/31 16:55:05
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:kaoato No.1

回答回数236ベストアンサー獲得回数86

ポイント500pt
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/hoge/
RewriteCond %{REQUEST_URI} !^/hoge$
RewriteCond %{REQUEST_URI} !^/$
RewriteRule ^(.*)$ / [R=301,L]
RewriteRule hoge/hoge\.html /hoge [R=301,L]

・/hoge と / 以外は、トップページに転送
・hoge/hoge.html は /hoge に転送

!=> NOT(ではない)
RewriteCond は続けて書くと、AND(かつ)条件

他1件のコメントを見る
id:a-kuma3

回答の末尾の表現は、
「『!』は、『NOT』ではない」と書いているようにしか読めないのですが、私の誤読ということでしょうか。

私の誤読であれば、申し訳ありません。

2018/03/28 23:19:16
id:kaoato

修正前:!=> NOT ではない
修正後:!=> NOT(ではない)

書き方が良くなかったようなので修正しました。

2018/03/29 00:01:43
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント500pt

No.1 の回答で基本的にあってはいるのですが、質問の題意を汲むと、最初の方に書いたルールで geho に飛ばしたのも、それ以降のルールに引っかかるのでトップに飛ばされます。
特定のページでリダイレクトした先の URL を、最後の「××以外をトップに飛ばす」というルールの対象外に書く、という感じになると思います。

RewriteEngine on
RewriteBase /
RewriteRule hoge\.html /geho [R=301,L]      # geho に飛ばして、ここで終了
RewriteRule fuga\.html /gafu [R=301,L]      # gafu に飛ばして、ここで終了
    ...
RewriteCond %{REQUEST_URI} !^/geho$         # 先のルールで geho に飛ばしたのを対象外
RewriteCond %{REQUEST_URI} !^/gafu$         # 先のルールで gafu に飛ばしたのを対象外
    ...
RewriteCond %{REQUEST_URI} !^/$             # このルールで / に飛ばしたのを対象外(ループしちゃう)
RewriteRule ^(.*)$ / [R=301,L]


!=>NOT ではない

どこから拾ってきたのか知りませんが、"!" は条件の反転ですね。

CondPattern is usually a perl compatible regular expression, but there is additional syntax available to perform other useful tests against the Teststring:
1. You can prefix the pattern string with a '!' character (exclamation mark) to negate the result of the condition, no matter what kind of CondPattern is used.

http://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteCond

(追記)

!=>NOT ではない

「!」は「NOT」の意味で、論理演算の「ではない」を表す、と言いたかったそうで。

id:cafe-beret

お二人ともありがとうございました。両方共大変参考になりました。

感謝申し上げます。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません