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

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

ただいまの
回答率

90.52%

  • Apache

    1813questions

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

  • .htaccess

    384questions

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

.htacessのRewrirteで指定のクエリがある場合にRewriteしないようにしたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 112

p0214

score 7

.htacessのRewrirteで指定のクエリがある場合にRewriteしないようにしたいです。

■実現したい事
・URLのクエリーにて?preview=tureもしくは&preview=trueの値がある場合
/index.phpにアクセス。
・URLに?preview=tureもしくは&preview=trueが含まれない場合
→/cache/○○/index.htmlにファイルがあればアクセス
→/cache/○○/index.htmlにファイルがなければ/index.phpへアクセスする

■現状の.htacessの記述

    RewriteCond %{REQUEST_METHOD} ^GET$
    RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f
    RewriteRule ^(.*)$ /cache/$1/index.html [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]

指定のクエリーがある場合はRewriteしないようにする、と言う処理をすれば良いかと思うのですが、記述の仕方を調べても分かりませんでした。
教えていただけますでしょうか。

WordPressにて構築したサイトで使いたいと考えています。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

RewriteCondで、%{QUERY_STRING}をチェックします。

「または」の否定なのでロジックが難しいですね。

追記

    RewriteCond %{REQUEST_METHOD} ^GET$
    RewriteCond %{QUERY_STRING} !(^|&)preview=true
    RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f
    RewriteRule ^(.*)$ /cache/$1/index.html [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]


でいいかと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/05 14:07

    「または」の否定は難しいのですね

    そうすると以下のような記述だと、できそうでしょうか?
    認識あっていますでしょうか。

    ====
    RewriteCond %{QUERY_STRING} ここにクエリチェックを入れる
    RewriteRule ^(.*)$ index.php [L]
    RewriteCond %{REQUEST_METHOD} ^GET$
    RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f
    RewriteRule ^(.*)$ /cache/$1/index.html [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]

    キャンセル

  • 2018/07/05 15:57

    今気づきましたが、「実現したいこと」の○○とはなんですか?
    また、「現状の.htacessの記述」の、RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f の$1が意味不明です。

    キャンセル

  • 2018/07/05 16:20 編集

    説明が不足していてすみません。

    例えばhttp://~~.com/○○/index.htmlにアクセスした際に
    /cache/○○/index.htmlにファイルがあれば /cache/○○/index.htmlを表示
    無ければ /index.phpと言う処理を想定しています。

    ○○の値はWEBページの数だけ存在します。

    また、$1についてはコピペしたものなので、もしかすると不要かもしれません。
    こちらを参考にしました。
    http://blog.direct-search.jp/2012/06/cakephp-html-cache-plugin-2x.html

    キャンセル

  • 2018/07/05 16:29

    ○○については了解しました。
    $1は私の間違いです。RewriteRuleの$1がそこより前のRewriteCondで参照できるとは知りませんでした。

    キャンセル

  • 2018/07/06 04:54

    追記いただいたコードそのもので動作いたしました。
    大変助かりました。ありがとうございます!!

    キャンセル

+1

うーんと、あまり難しく考えないで要求どおりに書いてみましたが、こんな具合でどうでしょう。

#URLのクエリーにて?preview=tureもしくは&preview=trueの値がある場合/index.phpにアクセス。
        RewriteCond     %{QUERY_STRING} "preview=yes"
        RewriteRule     .*              /index.html     [R,L]


#URLに?preview=tureもしくは&preview=trueが含まれない場合
#/cache/○○/index.htmlにファイルがあればアクセス

        RewriteCond     %{QUERY_STRING} "."
        RewriteCond     %{QUERY_STRING} !"preview=yes"
        RewriteCond     %{DOCUMENT_ROOT}/cache/%{REQUEST_URI}/index.html -f 
        RewriteRule     (.*)            /cache/$1/index.html [R,L]

#URLに?preview=tureもしくは&preview=trueが含まれない場合
#/cache/○○/index.htmlにファイルがなければ/index.phpへアクセスする


        RewriteCond     %{QUERY_STRING} "."
        RewriteCond     %{QUERY_STRING} !"preview=yes"
        RewriteCond     %{DOCUMENT_ROOT}/cache/%{REQUEST_URI}/index.html !-f
        RewriteRule     (.*)            /index.php [R,L]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/06 04:43

    有難う御座います!!
    いただいたコードそのままだとリライトが動作しませんでしたので、
    以下のようにすると想定した動作となりました。


    RewriteEngine On
    RewriteCond %{QUERY_STRING} "preview=true"
    RewriteRule ^(.*)$ index.php [QSA,L]
    RewriteCond %{REQUEST_METHOD} ^GET$
    RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f
    RewriteRule ^(.*)$ /cache/$1/index.html [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]

    大変助かりました。
    ありがとうございました<(_ _)>

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Apache

    1813questions

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

  • .htaccess

    384questions

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