.htaccessでのmod_rewrite設定。


いろいろ、参考書やネット検索で見ますが、リダイレクトしてくれません><

http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%93
のURLを
http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93
このように変えたいと思っています。


上記の場合.htaccessの中身は

AddHandler x-httpd-php5 .php .phps

RewriteEngine on
RewriteRule ^/worddetail/(.*)$ /worddetail.php?tag=$1

ではおかしいでしょうか?


『AddHandler x-httpd-php5 .php .phps』はサーバーでPHP4とPHP5が選択でき、PHP5を選択した際ドキュメントディレクトリに自動で.htaccessも作成されました。
その.htaccessに、
RewriteEngine on
RewriteRule ^/worddetail/(.*)$ /worddetail.php?tag=$1
を自分で追加したのですが・・・。
500や403エラーは出ないのですが、URLはちっとも変化しません。


Xサーバーを使っています。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/11/03 20:40:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:GEN111 No.1

回答回数472ベストアンサー獲得回数58

ポイント27pt

これではどうでしょう。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^worddetail/(.*)$ worddetail.php?tag=$1
id:seadwell

いつもありがとうございます。

ダメですね~。

何がいけないんでしょう・・・?

2007/10/27 21:33:54
id:y-kawaz No.2

回答回数1422ベストアンサー獲得回数226

ポイント27pt

httpd.conf に書く場合は質問中の書き方で良いと思いますが、

.htaccess で書くなら場合はカレントディレクトリからのパスがマッチされるので頭の / が要らないんじゃないでしょうか?

RewriteEngine on
RewriteRule ^worddetail/(.*)$ /worddetail.php?tag=$1

多分↑こうしてやるとマッチすると思います。

id:seadwell

いつもご回答ありがとうございます。

ダメみたいです・・・。

変更前URLや変更後URLを絶対パスや仮想URLに試したり、考え付くことはすべて試しましたがダメです。

現在こうなっています。

AddHandler x-httpd-php5 .php .phps

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^worddetail/(.*)$ /worddetail.php?tag=$1 [L]

URLエラーが出るならまだしも・・・

2007/10/27 23:28:54
id:tezcello No.3

回答回数460ベストアンサー獲得回数69

ポイント26pt

やりたい事がわかった気がします。


> このように私の動的サイトも静的に見せたいと考えました。

これは

http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93

でアクセスした場合

URL表示欄は

http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93

で、内部的に

http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%...

で表示されたページが表示されます。

以上より既に実現できていますね。


問題は、

http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%...

にアクセスした場合、URL表示欄も

http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%...

のままで、リダイレクトされないということです。

この時は、rewrite の条件に当てはまりませんので、書き換えれません。

また、Rule を追加して書き換えが出来たとしても、URLの表示欄は書き会える以前のままです。

(前の例で、アクセスしたURLがブラウザのURL欄に残ったままなのと同じ事です)


RedirectMatch を使う事で、特定の条件の時のアクセス先を書き換えることが出来ます。

(ブラウザのURL欄も書き換え後のアドレスです)

ですが、クエリはクエリとして残ったままなので、削除する事が出来ません。

また、上手く使わないとループしてしまうようです。

(worddetail という同じキーワードであちらもこちらもやろうとするからでしょうか?)


自サイトからは、

http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93

でアクセスできるのでしょうから

http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%...

のようにクエリ付きでアクセスされるのは、そんなに多くないのでは?

(ひょっとするとテストしている時だけ?)

id:seadwell

こんにちは。

チョット回答が難しいです^^;

ヒョットして、私のmod_rewriteが行ってくれることの考え方自体が間違っているのでしょうか?


例えば、

http://blog.myrss.jp/archives/2007/01/7_url_url_mod_r.html

に書いてある事例ですと

確かに

http://www.sfa-cms.com/word/%E6%AF%8D%E3%81%AE%E6%97%A5/%E6%AF%8...

とURL表示欄はPATH_INFO式で表示されています。

この作者はキーワードはGETしていると、別なページにはっきり書いています。


> worddetail という同じキーワードであちらもこちらもやろうとするからでしょうか?

この部分もよく解らないのですが、worddetailはキーワードでなくworddetail.phpというファイル名です。

なんか、私が説明を勘違いしていますか?


> (ひょっとするとテストしている時だけ?)

いえいえ

http://tech.bayashi.net/svr/doc/apache/mod_rewrite.html

にも

http://www.google.co.jp/support/webmasters/bin/answer.py?answer=...

にもありますように、

ロボットのクロールがよりたやすくされ、インデックスが残されたいと考えたからです。

2007/10/29 12:21:30
  • id:tezcello
    まず、その .htaccess は効いていますか?
    例えば、
    ・わざと間違った記述をする -> 500エラーが返るはず
    ・単純な書換えを用意してチャンと機能するか
      例えば
      $_GET の内容を表示するだけの test.php を作っておいて、
      RewriteRule ^abc$ /test.php?tag=123 を記述しておいて
      http://www.hoge.com/test でアクセスする -> 404エラーが返るはず
      http://www.hoge.com/abc でアクセスする

    それと質問です。
    > 500や403エラーは出ないのですが、URLはちっとも変化しません。
    http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93
    でアクセスした時にエラーが出ない代りに何が表示されるのでしょうか?
  • id:seadwell
    tezcelloさん、コメントでわざわざありがとうございます。
    早速ご報告します。

    > わざと間違った記述をする -> 500エラーが返るはず
    改行タグを間違うとか、文法にない記述をしますと、500エラーが帰ってきます。
    それに、PHP5にしかない関数を使い、これが機能していますので.htaccessは機能しています。

    > http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93
    > でアクセスした時にエラーが出ない代りに何が表示されるのでしょうか?
    これが不思議と、思惑の
    http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%93
    が表示されるのです。
    URLは
    http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93
    のままで・・・???

    あと
    > 単純な書換えを用意してチャンと機能するか
    この部分ですが、現在テスト段階でものすごくシンプルなもので構成しています。
    その中で、ファイル名を何度も変えたり、.htaccessの構文が不意に間違っていたりして、403、404と500エラーは幾度か見ていますので、この部分に関する同様のテストはなされています。
  • id:GEN111
    こういうことなのかな……

    RewriteRule ^worddetail/(.*)$ http://www.hoge.com/worddetail.php?tag=$1 [R]
  • id:tezcello
    > > http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93
    > > でアクセスした時にエラーが出ない代りに何が表示されるのでしょうか?
    > これが不思議と、思惑の
    > http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%93
    > が表示されるのです。
    > URLは
    > http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93
    > のままで・・・???
    http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93 にアクセスして、
    worddetail.php に tag=%E5%B1%B1%E6%9C%AC%E6%A2%93 を渡す事が出来ているのなら、どこが問題点なんでしょうか?
    ブラウザのURL表示欄をhttp://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%93 にしたいという事でしょうか?
  • id:seadwell
    説明がわかりづらかったですかね・・・

    動的ページだとURL表示欄は
    http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%93
    と表示されますよね。
    これをURL表示欄は
    http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93
    にリダイレクトしたいのです。

    http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93
    でアクセスした場合
    URL表示欄は
    http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93
    で、内部的に
    http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%93
    で表示されたページが表示されます。

    問題は、
    http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%93
    にアクセスした場合、URL表示欄も
    http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%93
    のままで、リダイレクトされないということです。
  • id:seadwell
    GEN111さん失礼いたしました。
    コメント気付きませんでした。
    私が、コメント書いたり消したりしていたので、メール通知がそれに紛れていたようです。

    せっかくコメントくださったのですが、結果変わらずです・・・。
    URL表示欄は
    http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%93
    のままです。

    現在、レンタルサーバーに問い合わせ中です。
    技術的なことは通常サポート外ですが、こんだけのアドバイスを頂いても解決できないことを伝えれば、サポートしてくれるのでは?と甘い期待を抱いています。
  • id:GEN111
    やりたいことが分かったような気がしました。


    RewriteRule ^worddetail.php tmp/%{QUERY_STRING}?
    RewriteRule ^tmp/tag=(.*)$ http://www.hoge.com/worddetail/$1 [R]
  • id:seadwell
    え~、私の質問がおかしいので皆さんに迷惑と困惑をおかけしているみたいです。

    例えば、Amazonnの商品URLなど検索結果以外では、動的なはずなのに静的ページで表示しております。
    このように私の動的サイトも静的に見せたいと考えました。
    これは、
    http://www.google.co.jp/support/webmasters/bin/answer.py?answer=34431&topic=8522
    にも推奨していますのでそう考えました。

    GEN111さん、何度も何度もホント申し訳ないですm(_ _)m
    試した結果、403エラーが出ました。
    私の足らない知識と、ネット検索での事例を結構見ましたが、GEN111さんの最初の答えで方向は合ってると思います。
  • id:tezcello
    > ヒョットして、私のmod_rewriteが行ってくれることの考え方自体が間違っているのでしょうか?
    お望みの動作が、
    1. worddetail/abc ->、worddetail.php?tag=abc
    2. worddetail.php?tag=abc -> worddetail/abc
    の2つである事は理解できましたが、mod_rewrite で1.の動作は簡単に出来ます(もう実現済みですね)。

    2.の動作は、mod_rewrite ではできません。
    mod_rewrite で、ブラウザのURL欄とちがうアドレスへのアクセスだとhttpサーバに指令する事はできますが、ブラウザのURL欄を mod_rewrite では書き換えられないので。

    そこで、ご希望のブラウザのURL欄を書換えてやる為に、redirect を指示して実現する事も考えました。
    ですが、クエリを上手く渡せないので実現できませんでした。


    > この作者はキーワードはGETしていると、別なページにはっきり書いています。
    この動作は、1.の動作ですね。

    > > worddetail という同じキーワードであちらもこちらもやろうとするからでしょうか?
    > この部分もよく解らないのですが、worddetailはキーワードでなくworddetail.phpというファイル名です。
    >
    > なんか、私が説明を勘違いしていますか?
    紛らわしい書き方をしてしまい申し訳ないです。
    僕の書いた「キーワード」は、.htaccess で書き換え等を行わせようとする時の一致する文字列の事で、質問者さんがphpで受取りたい文字列等のことではありません。

    動作しませんが、.htaccess の内容としてはこんなのを考えていました。
    RedirectMatch worddetail\.php(.*)$ /worddetail/$1/
    RewriteEngine on
    RewriteRule ^worddetail/([0-9a-zA-Z]+)/?$ worddetail.php?tag=$1 [L]


    > > (ひょっとするとテストしている時だけ?)
    > いえいえ
    > (以下略)
    ロボットにクエリの付いていない、worddetail/abc のような形で読込ませたい事は了解しているつもりです。
    ロボットは自らクエリを作ったりはしないので、クエリが付いたアドレスがどこにも書かれていなければ、そのアドレスを持ち帰る事は無いのではありませんか?
    上の例の1.のように書き換えられた後のクエリ付きアドレスは、httpサーバ内での処理なので、ロボットが知る由もありません。
    ロボットが読み込んだページに、worddetail/abc のような記述しかなければ、検索エンジンからのアクセスも、worddetail/abc となると思います。
    (逆に、サイト内のリンクの記述を worddetail.php?tag=abc としていれば、検索エンジンには worddetail.php?tag=abc しか登録されない)

    まだ質問意図を理解できていませんでしたら、ご指摘ください。
    説明不足の点はお尋ねください。
  • id:nandedarou
    解決済みかも知れませんが、念の為コメントします。
    http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%93
    のアクセスを
    http://www.hoge.com/worddetail/%E5%B1%B1%E6%9C%AC%E6%A2%93
    にリダイレクトするには、
    phpファイルで処理するのがいいと思います。
    具体的には、worddetail.phpファイルの先頭に、次のように書けばいいでしょう。

    if( strpos($_SERVER['REQUEST_URI'],'.php') !== FALSE ){
    header("Location: http://www.hoge.com/worddetail/".$_GET['tag']);
    exit();
    }

    もちろん
    .htaccessには、次のように書いたそうですが、そのままにしておいて下さい。
    RewriteEngine on
    RewriteRule ^/worddetail/(.*)$ /worddetail.php?tag=$1
  • id:nandedarou
    上記の私のコメントのようにすれば、お望みの動作をするとは思いますが、
    静的ページのように見せたいのであれば、そもそも
    http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%93
    というアクセスをしないように設計すべきだと思います。

    例えば、aタグのhref属性の値や、formタグのaction属性の値などに、「?」を使わないものを記述します。

    そうすれば、.htaccessで、ご質問欄に書かれたように記述するだけで、OKだと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません