ID:2MkDoX さんの質問

.htaccessのリダイレクト除外について

現在、HPでスマホからのアクセスを以下の「.htaccess」でリダイレクトをしていますが、これに特定のディレクトリをリダイレクトから除外したいと「2. 」を「RewriteRule」の前に記述しましたが、上手く動作しません。

解決策が分かる方はご教示をお願い致します。

「1. 」
RewriteEngine on
RewriteCond %{REQUEST_URI} !/smart/
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteCond %{HTTP_COOKIE} !mode=pc
RewriteRule ^(.*)$ smart/$1 [R]
RewriteBase /

「2. 」
RewriteCond %{REQUEST_URI} !^(test1|test2|test3)

みんなの回答 3 件

ID:cRYCqa さんの回答

なんでこっちは
RewriteCond %{REQUEST_URI} !/smart/
なのに
RewriteCond %{REQUEST_URI} !^(test1|test2|test3)
なの?
RewriteBase / が最後にあるし。
コピペ?

ID:2MkDoX

.htaccessに明るくないので説明不足ですみません。
「1. 」のソースのに「2. 」の1行を加えた形で以下のようにしてみました。
実現したいのは「test1」「test2」「test3」は「smart」にリダイレクトしないように、その他はリダイレクトするようにしたいのですが、あまり理解していないので、どのように修正したらよいかご教示頂けますでしょうか?
RewriteEngine on
RewriteCond %{REQUEST_URI} !/smart/
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteCond %{HTTP_COOKIE} !mode=pc
RewriteCond %{REQUEST_URI} !^(test1|test2|test3)
RewriteRule ^(.*)$ smart/$1 [R]
RewriteBase /

ID:GZRRFo さんの回答

.htaccessって書き方よくわからないですよね。
自分も勉強しないとなーって思ってるところです。

ID:2MkDoX

そうですね。
一度キッチリと勉強すればサイト運営の強い味方になるので、この機会に勉強していくつもりです。

ID:Yl2ULj さんの回答

うまく説明できないけど、一行ずつ解説してみるテスト。

> RewriteEngine on
読んで字のごとく、リライトエンジンをオンにする。
これからURLを書き換えますよー、ってな宣言的な何か。

> RewriteCond %{REQUEST_URI} !/smart/
CondはConditionの略。つまり、書き換え条件。
%{~}はサーバー変数。
REQUEST_URIには、アクセスされたURLからプロトコル表記とドメイン名を取った物が入る。
h ttp://example.com/aaa/bbb/ccc.html にアクセスされたとしたら、
/aaa/bbb/ccc.html がREQUEST_URIになる。
!/smart/ の部分はそれに一致する正規表現。先頭に ! がつくとNOT(否定)。意味が逆になる。
つまり「REQUEST_URI の中に『/smart/』が入っていなかったら」この先の書き換えルールが適用される。

> RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
これも上と同じ。RewriteCondは連続で書くと AND(かつ)という意味になる。
HTTP_USER_AGENTにはユーザーエージェントと呼ばれる、アクセスした人のブラウザやOSによって異なった文字列が入る。
正規表現は括弧で括って縦棒で区切ると OR(または)の意味になる。
iPod、またはiPhone、iPad、Android、Windows Phoneのどれかなら、次に進む。

> RewriteCond %{HTTP_COOKIE} !mode=pc
今度はクッキー。!があるから意味が逆転。
「mode」という名前のクッキーが「pc」じゃなかったら、さらに次へ進む。

> RewriteRule ^(.*)$ smart/$1 [R]
書き換えルール。
ここまでの条件を潜り抜けてきたアクセスに対して、このルールが適用される。
^(.*)$ が書換対象。smart/$1が書換後の文字列。
.htaccessがおかれたディレクトリを / として、ここからのパスに対して、
正規表現 ^(.*)$ にマッチした時、後ろの smart/$1 になるようにする。
この時、後ろの smart/$1 はRewriteBaseの影響を受ける。
RewriteBase / なら、ドキュメントルートからの相対パスとして扱われる。
指定がなければ、.htaccessがおかれたディレクトリからの相対パスとして扱われる。
^は前方一致。$は後方一致。.*は0文字以上の任意の文字列最長一致。
要するに最初から最後まで。必ず一致する。
()で括ると、括った順に$1、$2……と後ろで使うことができる(後方参照)。
h ttp://example.com/aaa/bbb/ccc.html なら aaa/bbb/ccc.html が $1 に入る。
[R] がつくとリダイレクトになる。Rがつかない場合はファイルの参照先がそこに変わる。

さて、特定のディレクトリを除外するにはどうすればいいか。
> RewriteCond %{REQUEST_URI} !^(test1|test2|test3)
上記のとおり、!で否定。^で前方一致。括弧と縦棒でOR。
「REQUEST_URIがtest1、test2、test3のどれかで始まっていなかったら」、ということになる。
しかし、REQUEST_URIは「アクセスされたURLからプロトコル表記とドメイン名を取った物が入る」ので、必ず / から始まってしまうので、常に条件に一致する(=書き換えられてしまう)。
/も入れてあげれば、意図したように動くかもしれない。
RewriteCond %{REQUEST_URI} !^/(test1|test2|test3)

ID:Yl2ULj

何か頭悪い文章になったな……。寝る。

ID:GZRRFo

おおおおおお、すごい勉強になった!トピ主じゃないけどコメ主さんありがとう!!

ID:vsgDPj

素晴らしい!!

ID:P4/Iy.

初心者に丁寧なご回答本当に有難うございます!
キッチリ目を通して確認後、報告させていただきます。
m(__)m

最終更新日:2013-12-18 (20,795 views)

関連するトピックス

ページ上部に戻る