人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: cafe-beret
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● kaoato
●500ポイント
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(かつ)条件


kaoatoさんのコメント
!を「否定」という日本語訳で誤訳だとは個人的には思えませんが・・。

a-kuma3さんのコメント
回答の末尾の表現は、 「『!』は、『NOT』ではない」と書いているようにしか読めないのですが、私の誤読ということでしょうか。 私の誤読であれば、申し訳ありません。

kaoatoさんのコメント
修正前:!=> NOT ではない 修正後:!=> NOT(ではない) 書き方が良くなかったようなので修正しました。

2 ● a-kuma3
●500ポイント

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」の意味で、論理演算の「ではない」を表す、と言いたかったそうで。


質問者から

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


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ