- ベストアンサー
mod_rewriteの正規表現
- 正規表現を使用して、動的ページを静的ページのように表示したい
- RewriteRuleを使用して、test.php?aid=00000001をtest/aid/00000001に表示したい
- 問題の原因は間違った正規表現の使用であり、うまくリダイレクトされない
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
以下を試してみてください。 ◎ドキュメントルート(/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のインストール・設定がまずいのかもしれませんね。。。
その他の回答 (5)
- fdsjaklfjas
- ベストアンサー率81% (96/118)
>画像のパスも 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のプログラムの内容を合せて確認して下さい。
お礼
fdsjaklfjas さんご回答ありがとうございます。 ・変換ルール(RewriteRule)を変える。 test/aid/00000001 ではなく、 test_aid_00000001 に書き換えるルールにする。 で操作するようにいたしました。 そのようにしたら、パラメータが増えるという現象もなくなりました。 ご丁寧にいろいろありがとうございました。
- fdsjaklfjas
- ベストアンサー率81% (96/118)
とりあえずうまくいってよかったです。 >画像等は相対パスで設定されているため、表示されなくなりました。 >これを表示するには、絶対パスで設定するしかないのでしょうか? 対策は、以下のようなものがあります。 ・HTML中のimg srcパスを手で書き換える。 - 画像の相対パスの頭に、../../をつける。 - 画像のパスを絶対パスにする。 ・変換ルール(RewriteRule)を変える。 test/aid/00000001 ではなく、 test_aid_00000001に書き換えるルールにする。 ・画像のパスも、mod_rewriteで書き換える。 新しいRewriteRuleを追加する。
補足
fdsjaklfjas さんご回答ありがとうございます。 対策としてはいろいろあるようですね。 画像のパスも mod_rewrite で書き換えるというのが一番スマートのような気がします。 ですが、ページ数もかなりありますのでそのページごとに 変換ルールを書く予定でおります。 変換ルールは10個程度が限界だとどこかのページで見た気が・・・。 あと、一度 test/aid/00000001 にアクセスし、アクセスしたページから 再度 test/aid/00000001 にアクセスをすると test/aid/00000001/aid/00000001 とパラメータがどんどん増えていってしまうのですが これはなぜでしょうか?
- fdsjaklfjas
- ベストアンサー率81% (96/118)
うまくいかないようですね。すみません。 エラーログには、どのように出力されているのでしょうか。 また、以下のようにしても、やっぱりだめですか? RewriteEngine on RewriteRule test/([0-9A-Za-z]+)/([0-9]+) /hoge/test.php?$1=$2 [L] これで解決しなかったら、すみませんが私には解決出来そうもありません。。。
お礼
fdsjaklfjas さん いろいろありがとうございます。 ご提示いただいたものでも、以前試しておりました。 .htaccess にはBasic 認証や php.ini の設定を記述しておりましたの それは httpd.conf に書き、RewriteRule だけにしたら動きました。 ありがとうございます。 画像等は相対パスで設定されているため、表示されなくなりました。 これを表示するには、絶対パスで設定するしかないのでしょうか?
- fdsjaklfjas
- ベストアンサー率81% (96/118)
> 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にしたほうがよいと聞いたことがあります。 (実際の効果は、測定したことが無いから判りません)
補足
fdsjaklfjas さん ご回答ありがとうございます。 リンク先をご指示いただいたものにし、 .htaccess内に RewriteEngine on RewriteBase /home/test01/www RewriteRule ^/test/(0-9A-Za-z]+)/([0-9]+)$ /test.php?$1=$2 としたのですがページがありません、と言われてしまいます。
- fdsjaklfjas
- ベストアンサー率81% (96/118)
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の話ですが。。。
補足
fdsjaklfjas さん ご回答ありがとうございます。 Apacheの話ですね。申し訳ありません・・・ SEO対策などで動的ページを静的ページに見せたいのですが ユーザがアクセス(リンク先)は↓ test.php?aid=00000001 で、実行結果を返しつつ、URLは↓ test/aid/00000001 にしたいと考えているのですが・・・ 考え方がおかしいでしょうか? fdsjaklfjas さんのやり方で、やってみましたが、URLの書き換えが 行なわれません。
補足
fdsjaklfjas さん サンプルのご提示ありがとうございます。 ご指示いただいたようにやってみたのですが、表示されません。 以前テストで、下記のように表記し RewriteRule index\.html /test.php?sid=00000001 index.htmlにアクセスすると、test.php?sid=00000001 の内容が表示されていたので、インストールはできていると 思っていました。 httpd.conf にも LoadModule rewrite_module modules/mod_rewrite.soが あることを確認しております。