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
よろしくお願いいたします。
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(かつ)条件
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:
http://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteCond
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.
(追記)
!=>NOT ではない
「!」は「NOT」の意味で、論理演算の「ではない」を表す、と言いたかったそうで。
回答の末尾の表現は、
2018/03/28 23:19:16「『!』は、『NOT』ではない」と書いているようにしか読めないのですが、私の誤読ということでしょうか。
私の誤読であれば、申し訳ありません。
修正前:!=> NOT ではない
2018/03/29 00:01:43修正後:!=> NOT(ではない)
書き方が良くなかったようなので修正しました。