Apacheのmod_rewriteモジュールについて

このQ&Aのポイント
  • mod_rewriteモジュールのRewriteRuleには、[QSA]というオプションがあります。
  • これは、置換文字列の中でマッチしたものを書き換えるのではなく、そこにクエリー文字列部分を追加するように、書き換えエンジンに強制します。
  • 具体的に、[QSA]を付けた場合と付けない場合では、どのような違いがあるのでしょうか?
回答を見る
  • ベストアンサー

Apache の mod_rewrite モジュールについて

Apache の コーナーがなかったのでここに書きます。 mod_rewrite モジュールの RewriteRule に [QSA] というオプションがあるのですが、これは何でしょう? http://www.net-newbie.com/trans/mod_rewrite.html によると > このフラグは、置換文字列の中でマッチしたものを書き換えるのではなく、 そこにクエリー文字列部分を追加するように、書き換えエンジンに強制 します。書き換えルールを通してクエリー文字列に何かデータを追加したい 場合にこのフラグを使います。 らしいですが、意味が分かりません。。。 具体的に、[QSA] を付けた場合と付けない場合は、どうちがうのですか?

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.1

> Apache の コーナーがなかったのでここに書きます。 「その他(プログラミング)」にされたほうがよろしいかと思われますが? > 書き換えルールを通してクエリー文字列に何かデータを追加したい > 場合にこのフラグを使います。 書き換えルールを通して QUERY_STRING に何かデータを追加したい 場合にこのフラグを使います。 と書きかえると意味がわかりませんか? カテゴリ違いですし、私が説明すると長くなるので検索する URL を 貼っておきます。 一番最初の候補にわかり易い説明が見つかるはずです。 QSA mod_rewrite - Google 検索 http://www.google.co.jp/search?q=QSA+mod_rewrite

sweepea
質問者

お礼

ご回答ありがとうございます。 問題、解決しました。 ありがとうございました。

関連するQ&A

  • mod_rewriteの環境変数を埋め込みたい

    お世話になります。 現在、以下の環境でWebアプリケーションを開発しています。 CentOS5.4 Apache2.2.3 Tomcat7 JavaSE6 ApacheとTomcatの連携にmod_proxy_ajpモジュールを使用しています。 ただ、クライアントからアクセスするURLと連携先のURLが異なるため、Java側でHttpRequestからコンテキストパス以降を取得するとajp連携されたパスしか取得できず、クライアントがアクセスしたURI情報が取得できません。 これを対策するために、Apacheモジュールのmod_rewriteとmod_headersを利用して、 クライアントがアクセスしたURIをリクエストヘッダに埋め込もうとしています。 以下httpd.confに追加した設定です。 (rewrite.confも試しました) RewriteEngine On RewriteRule .* - [E=ORG_QUERY_STRING:%{QUERY_STRING}] RequestHeader append "test_query_string" %{ORG_QUERY_STRING}e 設定後、Apacheを再起動してWebアプリケーションにアクセスすると、リクエストヘッダ自体は追加されているのですが値が(null)となってしまい取得できません。 mod_rewriteの環境変数が取得できていないのかと思い、 RewriteRule .* - [E=ORG_QUERY_STRING:TEST] と固定文字列を埋め込んでも取得できませんでした。 このことからENVによる環境変数への設定、または参照が出来ていないのかと思われますが、どうにも解決できません。 参照時に RequestHeader append "test_query_string" %{ENV:ORG_QUERY_STRING}e としても同様の結果でした。 心当たりのある方、またはデバッグ方法や別解などアドバイスを頂けないでしょうか? なお、httpd.confではmod_rewrite、mod_headersのモジュール定義は有効となっております。 また、環境変数のスペルミスもコピペして確認しております。

  • mod_rewriteが効かない!

    サーバの運用上、mod_rewriteを使う必要が出来たので設定してみたのですが効きません。 FreeBSD4.11+Apache1.3.33で httpd.confファイルに直接書き込んで試しています。 LoadModule rewrite_module modules/mod_rewrite.so AddModule mod_rewrite.c のどちらも書いてあるにもかかわらず、下記のテスト設定を試してみたらローカルIPからアクセス出来てしまいます。 RewriteEngine on RewriteCond %{REMOTE_ADDR} ^192\.168\.1\. ←ローカルネットワークのアドレス RewriteRule ^.*$ - [F] どのようにしたらいいですか? アドバイスお願い致します。

  • httpsでmod_rewriteができない

    はじめまして。 Linux環境で、apacheのhttp.confにmod_rewriteを記載し、httpsとhttpを切り替えたいと思っています。 httpd.confに以下のように記述しています。 <IfModule mod_rewrite.c> RewriteEngine on  #(1)httpで/aaaa/bbbbにアクセスされたときにhttps://~に変えたい RewriteCond %{REQUEST_URI} ^/aaaa/bbbb RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R]  #(2)httpsで/cccc/ddddにアクセスされたときにhttp://~に変えたい RewriteCond %{REQUEST_URI} ^/cccc/dddd RewriteCond %{HTTPS} on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R] </IfModule> 上記(1)のhttpでのアクセス時には、mod_rewriteが効いてhttpsへ切り替えられるのですが、 上記(2)のhttpsでのアクセス時には、mod_rewriteが効いていないようでhttpへ切り替えられません。 rewriteログを見てみると、当サイトへhttpでアクセスした場合にはログが出力されますが、 httpsでアクセスした場合には出力されません。 そもそもhttpsでのアクセスの場合にhttpd.confのmod_rewriteが効いていないようです。 ですが、これに対しどこを調査すべきかが分かっていません。 SSLの設定自体は出来ていると思っていて、 https://xxxx.jpのようにアクセスするとちゃんとページが表示されます。 どの当たりに問題がありそうでしょうか? 解析のヒントを頂けたらと思います。 宜しくお願い致します。

  • mod_rewriteについて

    いつも参考にさせていただいております。 mod_rewrite を使って動的ページを静的ページに見せようとしています。 サイト内で検索する場合、検索条件が多数あるため どのようにしたらいいのか悩んでいます。 RewriteRule ^test_a_([0-9A-Za-z_]+) /test_a.php?%{QUERY_STRING} [L] としたとき、ページにはリンクされます。 ですが、パラメータとして扱われません。 (print_r($_GET); としても出力されません) 検索の場合、検索条件によってパラメータが変化するので RewriteRule を多々書き込まなくてはいけなくなってしまいます。 ですが、あまり書きすぎると動作がおかしくなると聞いています。 何かいい方法はありますでしょうか。 ご教授よろしくお願いいたします。 <環境> PHP:4.3.2 Apache:2.0.40 (Red Hat Linux)

  • mod_rewriteについて

    初めて質問させていただきます。 よろしくお願いします。 Solaris8にてApacheを動かしています。 【問題】「HTTP TRACE」を拒否するためにmod_rewriteモジュールをインストールしようと思うのですがうまくいきません。 【詳細】mod_rewriteをインストールするとmod_soが消えてしまい、mod_soを入れなおすとmod_rewriteが消えてしまいます。  ./configure --enable-module=so --enable-module=rewrite とすると両方が入るみたいなんですが、 /usr/local/apache/bin/apachectl startssl としても、  Syntax error on line 206 of /usr/local/apache/conf/httpd.conf: Cannot load /usr/local/apache/libexec/libssl.so into server: ld.so.1: /usr/local/apache/bin/httpd: 重大なエラー: 再配置エラー: ファイル /usr/local/apache/libexec/libssl.so: シンボル ap_global_ctx: 参照シンボルが見つかりません。 /usr/local/apache/bin/apachectl startssl: httpd could not be started と、こんなエラーが出てhttpdがスタートできません。 どこに原因があるためのエラーなのでしょうか??

  • mod_rewrite の記述について

    .htaccess に、mod_rewrite の記述を書いて、以下のようなことをしたいのですが、 1.http://www.example.com/abc/ の場合 URLはそのままで、内容は /main/abc/以下 (の同名ファイル)を表示 2.http://www.example.com/main/abc/ の場合 URLは http://www.example.com/abc/ になり、内容は/main/abc/を表示 以前教えていただいた以下の記述でできるのですが、ディレクトリが追加されたら、.htaccess にも追加が必要になってしまいます。 どのように実現すればよいでしょうか? ------------------------------------------------------------ RewriteCond %{REQUEST_URI} ^/main/(.*)$ RewriteCond %{HTTP:My_Redirect} !yes RewriteRule ^main/(.+)$ http://example.com/$1 [QSA,R] RewriteCond %{REQUEST_URI} ^/(abc|aaa|bbb|ccc|ddd)/ RequestHeader set My_Redirect yes RewriteRule ^(.*)$ /main/$1 [QSA,L] ------------------------------------------------------------

  • mod_rewrite設定について

    mod_rewrite設定について mod_rewriteでcgiに渡す引数の一部のみを書き換えることは可能でしょうか。 具体的には下記のような挙動を実現したいです。 http://mydomain.com/test.cgi?status=true&action=1 ↓ http://mydomain.com/test.cgi?status=false&action=1 2つ目の引数は複数のパターンが想定されています。 下記のようなrewriteの設定を試してみましたが リダイレクトされませんでした。 ~~~~~~~~~~~~~~~~~~~~~ RewriteEngine on RewriteRule ^/test.cgi?status=true(.*) http://mydomain.com/test.cgi?status=false$1 [QSA] ~~~~~~~~~~~~~~~~~~~~~ 助言をいただけないでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • HTML
  • Apacheのmod_rewriteに関してお

    Apacheのmod_rewriteに関してお教えください。 お世話になります。 色々なサイトを参考に試していますが、思う様にいかず困っています。 知恵をお借り頂けたらと存じます。 ・「mod_rewrite」を利用したメンテナンス画面の表示。 ・「F5」等で更新した際、本来の画面が表示される様、内部的な置き換えのみとしたい。 ・使用しているWebサーバは(Apache2.2系) ・「mod_proxy_ajp」を利用したコネクタ連携を行っている。 ・ホスト名によるバーチャルホスト ・configファイルに記載する方法で試し中 ・メンテ用html メンテナンス用htmlは、別途指定した「DocumentRoot」に配備しており、 同ディレクトリにイメージファイル格納用フォルダがある。 そのフォルダ内にimgファイルが配備されている。(pngファイル等) DocumentRoot Lhtmlファイル L格納フォルダ\イメージファイル 現在、Apacheの機能に関して勉強中です。 メンテナンス用画面表示用として、例えば色々なサイトに有るような、以下記載をしたとします。 --------- RewriteCond %{REQUEST_FILENAME} !(/メンテナンス画面.html|.*\.(gif|jpe?g|png|js|css|ico))$ RewriteRule ^(.*)$ /メンテナンス画面.html [R=503,P,L] --------- 「http://ホストIP/」等でアクセスした場合、ドキュメントルートを参照、意図した動きとなるのですが、 「http://ホストIP/^ユーザディレクトリ/」や、「http://ホストIP/Aliasディレクトリ/」等 一階層深いURLだった場合、メンテ用htmlは、表示されるのですが、参照イメージファイルがパス違いにより 参照出来なくなり、意図した動きとなりません。 ※ 「http://ホストIP%{REQUEST_URI}」配下を参照しようとしている。(RewriteLogより) 「RewriteRule ^(.*)$」だと全てになってしまう為、ルールを分け設定してみましたが 第3引数の指定が悪いのか設定した「RewriteRule」を全て参照し「RewriteCond」が動いてしまう。 引数や正規表現の問題だとは考えておりますが、なかなか正解に辿り着けません。 よろしくお願いします。

  • apache apxsによるモジュール追加

    apacheをconfigure時にmod_soを指定しインストールした場合、再コンパイル無しでモジュールの追加ができるという認識でしたが、 apache標準モジュールでも追加の出来ないものがあるのでしょうか? 下記サイトでは、rewrite_moduleの追加方法があるのですが、他のモジュールも同じ方法で出来るのでしょうか? 【参考サイト】 http://kazmax.zpp.jp/apache/apache3.html また、3rdpartyモジュールがあれば、ダウンロードしコンパイルする事で追加可能ですが。。。。 3rdpartyモジュールが無く、apache標準モジュールでも追加の出来ないものがあるのであれば、再コンパイルになると思うのですが.... apache標準モジュールでも追加の出来ないものがあるのか わかる方いらっしゃいましたら教えて下さい。 もし、追加可能であり、上記参考サイトの方法以外であれば、教えて 頂きたいのですが。

  • Apache mod_rewriteが .htaccess ではうまく適用できない

    mod_rewriteで書き換えに挑戦しているのですが、うまく動いてくれません。 やりたいことは、 http://www.example.com/ 以下をすべて http://www.example.com/index.php に書き換えたい。 開発中は直接 httpd.conf を編集できるため RewriteEngine on RewriteRule ^/((?!css|js|img).*)$ /index.php?&%{QUERY_STRING} [L] 上記で問題なく動いているのですが、htaccessではinternal errorかACCESS forbidden, object notfound などでうまく以後来ません。 ためしに、 RewriteRule aaa index.php?&%{QUERY_STRING} [L] として、http://www.example.com/aaa にアクセスしても object notfound が返ってきます。 ^aaa としたり ^aaa$ としたり、いろいろ試してるのですが全滅・・・ 検索して見つかったサンプルなどをそのままコピーしても使えません。 ちなみに、開発環境では Apache2.2.4。 公開用では 1.3系 の予定です。 Apache2.2.4 の httpd.conf ではOK。htaccess ではOUT。 難しい・・・