• 締切済み

RewriteRuleの書き方

http://hoge.com?ab=111&cd=222 でアクセスした場合、 http://hoge.com/111/cd/222 にリダイレクトさせたいと考えております。 RewriteCond %{QUERY_STRING} ab= [NC] RewriteRule ^/?ab=([0-9a-zA-Z]+)&([0-9a-zA-Z]+)=([0-9a-zA-Z]+)$ /$1/$2/$3 [R] RewriteCond で、QUERY_STRING に ab= が含まれているとき、 RewriteRule を適用する のように書いても上手くいきませんでした。 お手数ですが、どなたかご教示いただければ幸いです。 よろしくお願いいたします。

みんなの回答

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

RewriteRule では QUERY_STRING が見えません。 http://wiki.apache.org/httpd/RewriteQueryString の最後の方が参考になります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • プログラムのクエリーをRewriteRuleの正規表現で書き換え

    ページを検索エンジンに登録させるために URLのクエリー以下(?からうしろ)を.htaccessのRewriteで書き換えて「/」区切りでアクセスさせようと思っています。 http://***.domain.com/program.html?a=1&b=2&c=3 ↓ http://***.domain.com/program/a/1/b/2/c/3.html 大抵このような場合 RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)\.html$ $1.html?$2=$3&$4=$5&$6=$7&$8=$9&$10=$11 [L] RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)\.html$ $1.html?$2=$3&$4=$5&$6=$7&$8=$9 [L] RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)\.html$ $1.html?$2=$3&$4=$5&$6=$7 [L] RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)\.html$ $1.html?$2=$3&$4=$5 [L] RewriteRule ^(.*)/(.*)/(.*)\.html$ $1.html?$2=$3 [L] のように追加していく書き方が簡単だと思うのですが、クエリーの数が多く正規表現の「()」で参照する変数が$10を超えてしまい上手く参照できません。 クエリーがいくら追加されても対応できる汎用性のある記述を作ろうと思っています。 何か良い方法があったら教えて下さい。

    • 締切済み
    • PHP
  • httpd.confのmod_rewite設定

    下記のようにMAMPのhttpd.confの一番下にmod_rewite設定のため行を追加したのですが 動作しません。 ※ちなみにURLをmod_rewite設定で http://localhost/○○○/index.php?category=△△△△△ を http://localhost/○○○/△△△△△ にする予定です。 よろしくお願いいたします。 RewriteEngine On RewriteCond %{REQUEST_URI} ^/○○○○/?(.*)$ RewriteCond %{QUERY_STRING} (^|&)category=([^&]+)($|&) RewriteRule ^([0-9a-zA-Z_-]+)/([0-9a-zA-Z_-]+)/([0-9a-zA-Z_-]+)$ index.php?category=$1 [QSA,PT] RewriteLog tmp/rewrite.log RewriteLogLevel 3

    • 締切済み
    • PHP
  • mod_rewriteでQUERYパラメータ数操作

    mod_rewriteで、静的化したいのですが、 QUERYパラメータ数が変化する場合には、どうすればよいでしょうか? ■現状 ▼URL /hoge.php?id=1 ▼.htaccess RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^hoge([0-9A-Za-z]+)\.html$ hoge.php?id=$1 [L] QUERYパラメータ数が一個のときは、 hoge1.htmlとなり、うまくいくのですが、 下記URLのようにQUERYパラメータがない場合があり、その場合に、エラーとなります(元のリンク自体も書き変えるので)。 /hoge.php QUERYパラメータ数が変化する(ない場合もある)時の.htaccessは、 どのように書けばよいのでしょうか? ・htaccess内で、条件分け可能なのでしょうか?

    • ベストアンサー
    • PHP
  • 動的ページを静的ページの変換

    動的ページを静的ページの変換で http://www.yyyyy.com/aaa/bbb/xxx.php?word=xxx&ger=1234&sort=xxxx を http://www.yyyyy.com/aaa/bbb/xxx.php/xxx/1234/xxxx.html としたいのですが、、うまくいきません。 DirectoryIndex xxx.php RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9A-Za-z]+)/([0-9]+)/([0-9A-Za-z]+)\.html$ xxx.php?word=$1&ger=$2&sot=$3 [L] と RewriteEngine on RewriteRule ^([0-9A-Za-z]+)/([0-9]+)/([0-9A-Za-z]+)\.html$ xxx.php?word=$1&ger=$2&sot=$3 [L] で試しました。 サーバーはxreaです。 よろしくおねがいいたします。

    • 締切済み
    • PHP
  • .htaccess の RewriteRule で、引数が10個以上あ

    .htaccess の RewriteRule で、引数が10個以上ある場合の書式について .htaccess に、下記のように記述をしています。 長ったらしいですが、要するに引数を16個渡したいのです。 RewriteRule ^example_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+)_([0-9A-Za-z\-]+).html$ example.php?VAR01=$1&VAR02=$2&VAR03=$3&VAR04=$4&VAR05=$5&VAR06=$6&VAR07=$7&VAR08=$8&VAR09=$9&VAR10=$10&VAR11=$11&VAR12=$12&VAR13=$13&VAR14=$14&VAR15=$15&VAR16=$16 ですが、こう書くと、例えば「VAR16=$16」の「$16」は「$1 と "6"(文字列としての6) を連結したもの」と解釈されてしまうらしく、うまく表現できません。 10個以上の引数を渡したい場合、どう記述すれば良いでしょうか。

    • ベストアンサー
    • PHP
  • RewriteRule有効について(Apache設定)

    Apache2をWindows2kにインストールし運用しています。 RewriteRuleを行うが有効になりません。 httpd.confと.htaccessは、以下のように記述しています。 .htaccessは、レンタルサーバーに転送しテストすると正常に動作します。 と言うことは、ローカルサーバーの環境設定がまずいと言うことになるかと思うのですがどうしても分かりません。 ご教授の程、宜しくお願いします。 -----(httpd.conf)----- Options All AllowOverride All LoadModule rewrite_module modules/mod_rewrite.so -----(httpd.conf)----- -----(.htaccess)----- RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^info.html+ info.php RewriteRule ^k/index.html$ k/index.php RewriteRule ^k/([0-9A-Za-z]+)/$ k/index.php?id=$1 -----(.htaccess)-----

  • mod_rewriteの書き方に困っています。

    http://www.○○○.com/1/2/3.htmlといった静的なリクエストを、 .htaccessを使って動的リクエストに読み替えています。 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)\.html$ index.php?a=$1&%{QUERY_STRING}[L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/([^/]*)\.html$ index.php?a=$1&b=$2&%{QUERY_STRING}[L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/([^/]*)/([^/]*)\.html$ index.php?a=$1&b=$2&c=$3&%{QUERY_STRING}[L] 違うのはディレクトリの階層(=引数の数)で、最大でa~eまで5つです。 ご覧のとおり、引数がいくつの場合でも、条件は同じなのです。 もっとスマートに書く方法があると思い、あれこれ試していますが、 自力ではうまくいかず、この形で運用しています。 技術向上のため、簡潔な書き方があれば知りたいです。 お気づきの書き方をご教示下さい。よろしくお願いします。 なお、php等を使ったスクリプトでの解析の提案ではなく、 .htaccessの記述方法としてのアドバイスをお願いします。

  • mod_rewrite 動的ページを静的ページへ

    SEO対策として、動的ページを静的ページへリダイレクトさせたいと考えています。 レンタルサーバーのため、.htaccessへ記入するしか方法はないと思っているのですが、 そもそも「静的化するってこと自体」がよく分かってないので、教えてください。 <現状> ▼URL /hoge/index.php?id=1 ▼.htaccess RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9A-Za-z]+)\.html$ details.php?id=$1 [L] <結果> 実行すると、/hoge/1.htmlとなり、望む結果を得られるのですが、 念のためディレクトリを指定しておきたいと思い、 RewriteRule ^/hoge/([0-9A-Za-z]+)\.html$ /hoge/details.php?id=$1 [L] としたところ、全く静的表示されなくなりました。 ■質問1 なぜ、ディレクトリを指定すると静的化できないのでしょうか? ■質問2 ネットでmod_rewriteの解説ページを検索してみると、静的化の例として、 「hoge/1.html へアクセスがあった際に、index.php?id=1の結果を返す」、 と記載されてます。 「index.php?id=1へアクセスした際に、hoge/1.html の結果を返す」 ようにした方がいいと思うのですが、 これって結果的には同じことをしている、と考えてよいのでしょうか? ■質問3 例えば、「/hoge/index.php?id=1」に対して、 「index.php?id=1へアクセスした際に、hoge/1.html の結果を返す」 ようにするには、どう書けばよいのでしょうか?

    • ベストアンサー
    • PHP
  • RewriteRuleによるパターンマッチング

    いつもお世話になっております。 RewriteRuleによるパターンマッチングで特定のファイルを外部の画像配信サーバより配信させてたいと考えておりますが上手くいっておらず行き詰っております。 前提・補足情報・現在発生している問題など記載しますので、どなたかお分かりになるようでしたらご支援いただけますと大変助かります。 ◆サイトの構造 htdocs |_ hoge |_ lib ◆前提 /htdocs/lib/movies/hoge/配下にmp4・swf・swfを配置しているが、 そのサイズが大きいため外部の画像配信サーバにキャッシュさせている。 そのため、mp4・swf・swfなどのファイルに対するリクエストがあった場合、 mod_rewriteによって外部の画像配信サーバにリダイレクトさせ外部サーバより クライアントにダウンロードさせるようにする。 ◆補足事項 mp4・swf・swfなどのファイルは、クライアントが/htdocs/hoge/index.phpをHTTPでGETすると、index.phpの内部で次の通り呼び出されクライアントに渡される構造となっている。 <source src="..lib/movies/hoge/hoge123.mp4"> ◆現在の問題点 .htaccessに次のようにRewriteRuleを定義しているが、 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RewriteRule ^(.*)\.(flv|mp4|3gp|jpg|gif|png)$ http://test.hoge.hoge.net/$1.$2 [NC,R,L] ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ rewrite_logをみると、 172.16.10.78 - - [12/Apr/2012:10:44:09 +0900] [172.24.133.81/sid#94d0478][rid#98e0880/initial] (3) [perdir /home/hoge/www.hoge.jp/htdocs/] applying pattern '^(.*)\.(flv|mp4|3gp|jpg|gif|png)$' to uri 'present/index.php' 172.16.10.78 - - [12/Apr/2012:10:44:09 +0900] [172.24.133.81/sid#94d0478][rid#98e0880/initial] (1) [perdir /home/hoge/www.hoge.jp/htdocs/] pass through /home/hoge/www.hoge.jp/htdocs/present/index.php index.phpに対してパターンマッチングしているため、flv|mp4|3gp|jpg|gif|pngらのファイルを外部サイトからGETするよう想定通りのリダイレクトができてきない。 ◆疑問 mod_rewriteの動きとして、上述のようにクライアントが直接HTTP GETせず、 phpを経由してflv・mp4を取得する場合、 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RewriteRule ^(.*)\.(flv|mp4|3gp|jpg|gif|png)$ http://test.hoge.hoge.net/$1.$2 [NC,R,L] ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ このような記述では、mod_rewriteのRewriteRuleによるパターンマッチングは有効とはらないのでしょうか? また、仮に次のように定義した場合、 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RewriteCond %{REQUEST_FILENAME} "\.(flv|mp4|3gp|jpg|gif|png)$" RewriteRule ^(.*)\.(flv|mp4|3gp|jpg|gif|png)$ http://test.hoge.hoge.net/$1.$2 [NC,R,L] ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 想定通りのパターンマッチングとなり、 test側へリダイレクトされるようになったりしますでしょうか?

  • Apache2.0.54にてRewriteRule内に/が含まれるパスが認識されない

    お世話になります。 TOCMAT5.0.3/Apache2.0.54 の環境にて 特定ページへのアクセスが来た際にsslにてアクセスを行いたく 以下のような設定を行いました。 .htaccessにて --------- RewriteEngine on RewriteBase / RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^test/test.html$ https://%{SERVER_NAME}/secure.html [R,L] RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^test.html$ https://%{SERVER_NAME}/secure.html [R,L] --------- test.htmlでアクセスすると正常にリダイレクトが行われるのですが RewriteRule内に「/」が含まれているものはうまく動作しません。。 以下のようなパスに変更などして試しているのですがうまくいきません。 ^test\/test.html$ ^test//test.html$ ^test/*$ 他のサーバーにて、同様のRewriteRuleは正常に動作しますので、 mod_jk.conf httpd.conf の設定に不備があるように考えていますが検討が付きません。 ご教授よろしくお願い致します。