mod_rewriteの正規表現

このQ&Aのポイント
  • 正規表現を使用して、動的ページを静的ページのように表示したい
  • RewriteRuleを使用して、test.php?aid=00000001をtest/aid/00000001に表示したい
  • 問題の原因は間違った正規表現の使用であり、うまくリダイレクトされない
回答を見る
  • ベストアンサー

mod_rewriteの正規表現

いつもお世話になっております。 mod_rewriteを使って、動的ページを静的ページのように表示したいと 考えております。 ですが、正規表現が間違っているようで、うまくリダイレクトされません。 test.php?aid=00000001 にアクセスされた場合 test/aid/00000001 と表示したいと考えております。 下記のように(他にもいろいろ試しましたが)やったのですが・・・ RewriteRule test.php?([0-9A-Za-z]+)$=([0-9]+)$ /test/$1/$2 [L] ご教授よろしくお願いいたします。 <環境> PHP:4.3.2 Apache:2.0.40 (Red Hat Linux)

  • PHP
  • 回答数6
  • ありがとう数3

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

  • ベストアンサー
回答No.3

以下を試してみてください。 ◎ドキュメントルート(/home/test01/www)の下に、hogeディレクトリを作る。 ◎hogeディレクトリ内に、test.phpを置く <?php var_dump($_GET); ?> ◎hogeディレクトリ内に、.htaccessを置く RewriteEngine on RewriteRule ^test/([0-9A-Za-z]+)/([0-9]+)$ /hoge/test.php?$1=$2 [L] ◎以下のURLにブラウザからアクセス http://your.domain.name/hoge/test/ABCDEF/2345 (your.domain.nameは適宜書き換えてください) 以下が表示されるはずです。 array(1) { ["ABCDEF"]=> string(4) "2345" } うまくいかなかったら、mod_rewriteのインストール・設定がまずいのかもしれませんね。。。

wonder_dct
質問者

補足

fdsjaklfjas さん サンプルのご提示ありがとうございます。 ご指示いただいたようにやってみたのですが、表示されません。 以前テストで、下記のように表記し RewriteRule index\.html /test.php?sid=00000001 index.htmlにアクセスすると、test.php?sid=00000001 の内容が表示されていたので、インストールはできていると 思っていました。 httpd.conf にも LoadModule rewrite_module modules/mod_rewrite.soが あることを確認しております。

その他の回答 (5)

回答No.6

>画像のパスも mod_rewrite で書き換えるというのが一番スマートのような気がします。 >ですが、ページ数もかなりありますのでそのページごとに >変換ルールを書く予定でおります。 >変換ルールは10個程度が限界だとどこかのページで見た気が・・・。 少なくとも、画像ファイル1つにつきRewriteRuleを1つ書く必要はないと思います(1つのRewriteRuleで多数の画像のURLの変換ができるはず)。 このへんの変換ルールの書き方がよく判らないようでしたら、以下をおすすめします。 ・変換ルール(RewriteRule)を変える。  test/aid/00000001 ではなく、  test_aid_00000001 に書き換えるルールにする。 >あと、一度 test/aid/00000001 にアクセスし、アクセスしたページから >再度 test/aid/00000001 にアクセスをすると >test/aid/00000001/aid/00000001 >とパラメータがどんどん増えていってしまうのですが まずは、test/aid/00000001の、リンクを張っている箇所のHTMLソースをみて、おかしなURLで無いか確認して下さい。 もしリンクのURLをPHPで動的に生成しているならば、PHPのプログラムの内容を合せて確認して下さい。

wonder_dct
質問者

お礼

fdsjaklfjas さんご回答ありがとうございます。 ・変換ルール(RewriteRule)を変える。  test/aid/00000001 ではなく、  test_aid_00000001 に書き換えるルールにする。 で操作するようにいたしました。 そのようにしたら、パラメータが増えるという現象もなくなりました。 ご丁寧にいろいろありがとうございました。

回答No.5

とりあえずうまくいってよかったです。 >画像等は相対パスで設定されているため、表示されなくなりました。 >これを表示するには、絶対パスで設定するしかないのでしょうか? 対策は、以下のようなものがあります。 ・HTML中のimg srcパスを手で書き換える。   - 画像の相対パスの頭に、../../をつける。   - 画像のパスを絶対パスにする。 ・変換ルール(RewriteRule)を変える。  test/aid/00000001 ではなく、  test_aid_00000001に書き換えるルールにする。 ・画像のパスも、mod_rewriteで書き換える。  新しいRewriteRuleを追加する。

wonder_dct
質問者

補足

fdsjaklfjas さんご回答ありがとうございます。 対策としてはいろいろあるようですね。 画像のパスも mod_rewrite で書き換えるというのが一番スマートのような気がします。 ですが、ページ数もかなりありますのでそのページごとに 変換ルールを書く予定でおります。 変換ルールは10個程度が限界だとどこかのページで見た気が・・・。 あと、一度 test/aid/00000001 にアクセスし、アクセスしたページから 再度 test/aid/00000001 にアクセスをすると test/aid/00000001/aid/00000001 とパラメータがどんどん増えていってしまうのですが これはなぜでしょうか?

回答No.4

うまくいかないようですね。すみません。 エラーログには、どのように出力されているのでしょうか。 また、以下のようにしても、やっぱりだめですか? RewriteEngine on RewriteRule test/([0-9A-Za-z]+)/([0-9]+) /hoge/test.php?$1=$2 [L] これで解決しなかったら、すみませんが私には解決出来そうもありません。。。

wonder_dct
質問者

お礼

fdsjaklfjas さん いろいろありがとうございます。 ご提示いただいたものでも、以前試しておりました。 .htaccess にはBasic 認証や php.ini の設定を記述しておりましたの それは httpd.conf に書き、RewriteRule だけにしたら動きました。 ありがとうございます。 画像等は相対パスで設定されているため、表示されなくなりました。 これを表示するには、絶対パスで設定するしかないのでしょうか?

回答No.2

> SEO対策などで動的ページを静的ページに見せたいのですが > ユーザがアクセス(リンク先)は↓ > test.php?aid=00000001 > で、実行結果を返しつつ、URLは↓ > test/aid/00000001 > にしたいと考えているのですが・・・ そもそも、SEO対策では、リンクのHTML記述を、 <a href="/test/aid/0000001">ほげほげ</a> にして、検索エンジンのクローラーがリンクを辿りやすいようにするのが目的ですよね? なので、SEO対策では、mod_rewriteの設定だけではなく、 リンク元のページのHTMLの書き換えをしなければなりません。 #<a href="/test.php?aid=0000001"> だったものを、 #<a href="/test/aid/0000001"> にします。 リンク元のページがPHPで動的に生成されているのであれば、 ob_start関数などを用いて、出力バッファリングを行ない、 自動的にHTMLの記述を書き換える手もあります。 (参考)http://jp2.php.net/manual/ja/function.ob-start.php それから、SEO対策としては、 <a href="/test/aid/00000001"> よりも、 <a href="/test/aid/00000001.html"> みたいに、 拡張子をhtmlにしたほうがよいと聞いたことがあります。 (実際の効果は、測定したことが無いから判りません)

wonder_dct
質問者

補足

fdsjaklfjas さん ご回答ありがとうございます。 リンク先をご指示いただいたものにし、 .htaccess内に RewriteEngine on RewriteBase /home/test01/www RewriteRule ^/test/(0-9A-Za-z]+)/([0-9]+)$ /test.php?$1=$2 としたのですがページがありません、と言われてしまいます。

回答No.1

SEO対策などで動的ページを静的ページに見せかけるのならば、 test/aid/00000001 にユーザがアクセスした場合に、 test.php?aid=00000001 の実行結果のHTMLをユーザに返したいのですよね? だとしたら、RewriteRule の引数1と2が逆ですね。 あと正規表現もおかしいです。 以下でどうでしょう。 RewriteRule ^/test/(0-9A-Za-z]+)/([0-9]+)$ /test.php?$1=$2 [L] #PHPではなくapacheの話ですが。。。

wonder_dct
質問者

補足

fdsjaklfjas さん ご回答ありがとうございます。 Apacheの話ですね。申し訳ありません・・・ SEO対策などで動的ページを静的ページに見せたいのですが ユーザがアクセス(リンク先)は↓ test.php?aid=00000001 で、実行結果を返しつつ、URLは↓ test/aid/00000001 にしたいと考えているのですが・・・ 考え方がおかしいでしょうか? fdsjaklfjas さんのやり方で、やってみましたが、URLの書き換えが 行なわれません。

関連するQ&A

  • 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について

    SEOに効果があるのかも賛否両論ですが.htaccessに以下のような指定で 拡張子がphpのものをhtmlに変更しました。 RewriteRule ^([A-Za-z0-9]+).html$ $1.php [L] ○○.htmlにアクセスがあれば実際には○○.phpを表示させるという ことで成功はしたのですが○○.phpにアクセスしても普通にページが 表示されてしまいます。 ロボットがきてhtmlとphpと同内容があればなにか問題があるのかと 思い(根拠がない勝手な妄想ですが)○○.phpにアクセスがあれば実際に 表示するのは○○.phpですが○○.htmlへリダイレクトさせたいと 思っているのですがどうやれば可能でしょうか? また実際にサーバーにアップしてあるファイルの拡張子はphpなので すがmod_rewriteでこのような設定をしただけでロボットにhtmlとして 認識されるのでしょうか? mod_rewriteは初めて使うもので希望の動作に必要性があるのかすら よくわからない状況なのですが詳しい方がおりましたら是非ご教授を お願い致します。

  • mod_rewriteについて

    いつもお世話になっております。 mod_rewriteを使ってURLの書き換えをしたいと思っております。 下記のようなファイルがあるとします。 http://www.domain.com/aaa/list.php http://www.domain.com/aaa/detail.php http://www.domain.com/bbb/list.php http://www.domain.com/bbb/detail.php PHPファイルはHTMLに書き換えています。 ---------------------------------------- RewriteEngine on # QUERY_STRING RewriteRule /([a-z]+)\/([a-z]+)\/([0-9]+)\.html$ /$1/$2.php?$3 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*)\.html$ /$1.php [L] ---------------------------------------- http://www.domain.com/aaa/detail/2.html http://www.domain.com/bbb/detail/2.html 上記どちらにアクセスしてもページが表示されませんと なってしまいます。 どうぞ、ご教授お願いいたします。 <環境> PHP:4.3.2 Apache:2.0.40 (Red Hat Linux)

    • ベストアンサー
    • PHP
  • 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でアドレスを書き換えたい思っています。 xamppでテストしていますがうまくいきません。 mod_rewrite.soの#は外しています。(つまり、.htaccess以外の設定はできていると思います) 【やりたい事】 localhost/test/index.php?p=test を  ↓ localhost/test/i/test でアクセスしたいです。 【参考にした情報】 http://www.sample.com/cgi-bin/sample/sample.cgi?a=123&b=456 というURLを静的なアドレスでアクセスできるように以下のように設定します。 RewriteEngine on RewriteRule ^/cgi-bin/sample/([0-9A-Za-z]+)/([0-9A-Za-z)]+)\.html$ /cgi-bin/sample/sample.cgi?a=$1&b=$2 [L] を言うのを見つけました。 【試したこと】 .htaccessをつくり RewriteEngine on RewriteRule ^/test/i/([0-9A-Za-z)]+)$ /test/index.php?p=$1 [L] と記入 【結果】 Object not found! 要求された URL は本サーバでは見つかりませんでした。 もし手入力で URL を入力した場合は、綴りを確認して再度お試し下さい。 と表示されました。 ------------------------------------------------------------------ localhost/test/i/testでアクセスするには、.htaccessをどう書けばいいのでしょうか? 疑問1.xamppでlocalhostでmod_rewriteができるのだろうか? 疑問2.参考にした情報のRewriteRuleの"^"がわからない。正規表現の"^"とは文頭にマッチすると思います。この場合の文頭とは? よろしくお願いします。

  • mod_rewriteの相対パス

    いつもお世話になっております。 mod_rewrite を使ってパスの書き換えを行いたいと思っております。 以前にも mod_rewrite について質問させていただいたのですが 違う方法で解決できました。 画像ファイル等のRewriteRule を教えていただきたく質問させていただきます。 例えば・・・ http://domain.jp/a.php?id=111 を http://domain.jp/a/id/111 に書き換えた場合、階層が深くなるため画像が表示されなくなります。 a.php の中には以下のような画像ファイルの記述があります。 <img src="./img/aaa.jpg"> <img src="./img/bbb.gif"> できれば、RewriteRule を使って画像ファイルのパスを書き換えたいと 思っております。 どのようなルールを書けばよろしいでしょうか。 それとも絶対パスじゃないと無理なのでしょうか。 ご教授お願いいたします。 よろしくお願いいたします。 <環境> PHP:4.3.2 Apache:2.0.40 (Red Hat Linux)

  • mod_rewriteについて教えてください。

    プログラミングのカテで質問をしていたのですが、回答がいただけなかったので、こちらで、再度質問させていただきます。 レンタルサーバー屋さんにも問い合わせたのですが、サポート外ということで、答えてもらえませんでした。 すみませんが、お力をかして下さい。 .htaccsessからmod_rewriteを使って、phpでつくった動的なページを静的にみせようとしているのですが、上手く行かず、行き詰っています。(hoge.php?mod=10をhoge/mod_10.htmlでアクセスできるようにしたい) うまく動いてくれないので、RewriteEngine onにつづけて、次のような基本的なケースを試してみました。 (1) RewriteRule ^/(.*)$ ​http://www.yahoo.co.jp/​ [L] =>反応なし。 (2) RewriteRule ^(.*)$ ​http://www.yahoo.co.jp/​ [L] =>#yahooが表示される。ただし、URLが​http://www.yahoo.co.jp/​になる。 (元のulrに引数が有る場合、URLは​http://www.yahoo.co.jp/?mod=10​のようになる。) (3) RewriteRule ^(.*)$ http://×××.com/index.php [L] =>エラーになる。 Apacheに関する知識がほとんどないことですが、私なりの疑問としては、 (1)のように、^/で始まるとマッチしない。 ===>参考にしたサイト等は、ほとんど^/ではじめているのになぜ? (2)では反応するが、urlが書き換えられてしまう、また、引数のみ引き継がれる。 ===>URLはもとのまま表示させたい。 (3)自分のトップページを表示させようとすると、エラーが発生する。 ===>理由が全く分からない。 以上のような状況ですが、アドバイスをいただきたく、お願いいたします。

  • mod_rewriteについて教えてください。

    mod_rewriteについてお願いします。 「a」と「b」というフォルダにそれぞれ「index.html」「test.html」が入っています。「a」と「b」で「index.html」「test.html」の内容はちがいます。 わたしが一番望んでいるのは http://example.com/a/以下にアクセスがあった場合 http://example.com/b/以下にリダイレクトさせるというものです。 例) http://example.com/a/test.htmlにアクセスがあったらhttp://example.com/b/test.htmlにリダイレクト。 ------------------------------------------------------------ Options +FollowSymLinks AddHandler cgi-script htaccess <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^/a/$ /b/$1 [R=302,L] </IfModule> ------------------------------------------------------------ としてみましたが、リダイレクトされません。 ちなみに RewriteRule ^$ /b/$1 [R=302,L] と書くと、http://example.com/にアクセスがあった場合 http://example.com/b/にリダイレクトされましたので mod_rewriteには対応しております。 ご教授のほど、よろしくお願いいたします。

  • mod_rewriteでの'?'表示

    http://www.example.com/search.cgi?a=mypage&b=go&c=1&d=2 を、 http://www.example.com/mypage/go/search?c=1&d=2 に変えたいですが、どのようにすればよいのでしょうか? htaccessでは・・・ Options +FollowSymlinks RewriteEngine on RewriteRule ^/([0-9A-Za-z]+)\/([0-9A-Za-z]+)\/search?c=([0-9A-Za-z]+)&d=([0-9A-Za-z]+)$ /search.cgi?a=$1&b=$2&c=$3&d=$4 [L] にしてもアクセスできません… APACHEマニュアルでは「?」は文字数指定と言う文法に なるらしく、「?」を表示させたいです。 http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteRule どうすればよろしいでしょうか?ご教示ください。

  • mod_rewriteで

    mod_rewriteで /dir/aaa/bbb/form.html  を  /dir/form.php?id1=aaa&id2=bbb にする書き方を教えてください いまのところ RewriteRule ^/dir/([0-9A-Za-z]+)/([0-9A-Za-z]+)/form.html /dir/form.php?id1=$1&id2=$2 [L] としていますが上手く出来ていないようです