mod_rewriteでアドレスを書き換えたい

このQ&Aのポイント
  • mod_rewriteを使って、アドレスの書き換えを試みていますがうまくいきません。
  • 参考にした情報では、RewriteRuleの正規表現パターンでURLを書き換える方法が示されています。
  • localhostでmod_rewriteを使用することができるかどうか、またRewriteRuleの'^'がどのように機能するのかについて疑問があります。
回答を見る
  • ベストアンサー

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の"^"がわからない。正規表現の"^"とは文頭にマッチすると思います。この場合の文頭とは? よろしくお願いします。

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

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

こんにちは。 >index.phpは、testフォルダーにあります。 .htaccessを置いてあるディレクトリから見て、RewriteBaseを指定します。 なので、testフォルダに.htaccessを置くと、 RewriteBase / となる理屈・・・。 ひとつ上のhtdocsに置いたので、そうなりますね。 っちゅうか、それは聞いてないよ??? >この場合とは、どのような条件のためでしょうか? httpd.confで指定しない場合という事です。 厳密に言えば、httpd.confで指定しているDocumentRootと、Rewriteするためのパスを解釈して欲しい一番上の階層が違う場合(レンタルサーバーなどは、殆どこんなの)ですね。 >しかし、相対パスでしているcssが適応されません。 ページ内のCSSやJS、画像ファイルなどは、別途GETリクエストで取得されます。 この時に、 localhost/test/i/test としてアクセスされていて、index.phpの方で、 <img src="../iamge.jpg"> となると、先ほどのGETリクエストは、 localhost/test/i/image.jpg を探しに行くので、表示されない事になります・・・。 回避策としては、 1.階層構造をよく吟味する。 2.相対パス指定をやめる。 3.Rewriteしてしまう。 ですかねぇ・・・。

a-z_A-Z
質問者

お礼

ありがとうございます。 再度質問後にいろいろ試してわかったのですが、追記の情報はindex.phpより、.htaccessの場所の情報の方が必要だったんですね。 私は、htdocsの中にフォルダーを作ってテストしています。そんなテストしているフォルダーがたくさんあります。 そのため、htdocsではなくフォルダーの中に.htaccessがあります。 普通は、htdocsに置くのがあたりまえですよね? まったく失礼しました。 cssの件は、リンクをmod_rewriteのアドレスに統一するために、追加のプログラムを書く必要があります。 その時に、絶対パスに書き換えることにします。 このたびは、とても詳しい説明をありがとうございます。 また何かありましたらよろしくお願いします。 ありがとうございました。

その他の回答 (1)

回答No.1

こんにちは。 とりあえず順番に・・・。 >.htaccessをつくり この場合、RewriteBaseが必要です。 つまり、 RewriteEngine on RewriteBase / RewriteRule ^test/i/([0-9A-Za-z)]+)$ /test/index.php?p=$1 [L] とまぁ、こうなる訳ですな・・・。 Baseディレクトリを指定する事で、.htaccessをおいてあるフォルダから、パスを算出してねという意味です。 その代わり、RewriteRuleの先頭に/を付けません。 >疑問1.xamppでlocalhostでmod_rewriteができるのだろうか? はい、できます。 xamppでしたら、httpd.confでもよさそうですが・・・。 >疑問2.参考にした情報のRewriteRuleの"^"がわからない。正規表現の"^"とは文頭にマッチすると思います。この場合の文頭とは? http://domain この後に続くアドレスの先頭という意味です。

a-z_A-Z
質問者

お礼

ありがとうございます。 教えていただいた通り試してみました。 でも、思うとおりにはなりませんでした。 そこで、次のように修正しました。 【追加条件】 index.phpは、testフォルダーにあります。 ファイル構成 c->xampp->htdocs->test->index.php ------------------------------ そこで、htaccessを RewriteBase /test/ RewriteRule ^i/([0-9A-Za-z)]+)$ index.php?p=$1 [L] すると、ページが表示されました。 しかし、相対パスでしているcssが適応されません。 なぜでしょう? >この場合、RewriteBaseが必要です。 この場合とは、どのような条件のためでしょうか?

関連するQ&A

  • 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 どうすればよろしいでしょうか?ご教示ください。

  • CentOSでhtaccessを使用してmod_rewrite

    CentOSで、htaccessを使用してmod_rewriteを利用したいのですが、いまいちどうしたらいいのかがわかりません。 動的URLを静的URLに変換したく、 htaccessに RewriteEngine on RewriteRule ^([0-9A-Za-z_]+)/$ index.php?t=$1 [L] と書きこみました。 すると404エラーがでます。 試しに #RewriteEngine on RewriteRule ^([0-9A-Za-z_]+)/$ index.php?t=$1 [L] とコメントアウトしたところ、通常に表示されました。 RewiteEngine on が何かしらの影響を与えていると思うのですが、 対策がよくわからないので質問いたしました。 ちなみにhttpd.confの設定は完了しています。 LoadModule rewrite_module modules/mod_rewrite.so と記述。

  • mod_rewriteについての質問です

    mod_rewriteについての質問です 画像の動的ページを静的ページに見せたいのですが、 http://aaa.com/gazou/image.cgi?http://aaa.com/ccc/半角英数文字/半角英数文字.jpg をmod_rewriteで静的ページに.htaccsesにて設定するにはどのように書けばよいでしょうか? こんな感じかなと思ってんですがうまくいきません。 RewriteEngine on RewriteRule ^/gazou/([0-9A-Za-z]+)/([0-9A-Za-z]+)\.html$ gazou/image.cgi?http://aaa.com/ccc/$1/$2.jpg [L] わかりにくくてすみません。 以上よろしくお願いします。

  • htaccessでmod_rewrite

    htaccessに下記のように記述しました。 RewriteEngine on RewriteRule ^([0-9A-Za-z_]+)/$ index.php?p=$1 [L] RewriteRule ^([0-9A-Za-z_]+)/([0-9A-Za-z_]+)/$ index.php?p=$1&m=$2 [L] RewriteRule ^([0-9A-Za-z_]+)/([0-9A-Za-z_]+)/([0-9A-Za-z_]+)/$ index.php?p=$1&m=$2&y=$3 [L] RewriteRule ^sample/test/([0-9A-Za-z_]+)/$ sample/test.php?id=$1 [L] すると 「http://www.○○○.jp/index.php?p=●」 は 「http://www.○○○.jp/●/」 「http://www.○○○.jp/index.php?p=●&m=△」 は 「http://www.○○○.jp/●/△/」 「http://www.○○○.jp/index.php?p=●&m=△&y=■」 は 「http://www.○○○.jp/●/△/■」 でアクセスできました。 が、 「http://www.○○○.jp/sample/test.php?id=★」 は 「http://www.○○○.jp/sample/test/★/」 でアクセスできません。 おそらく、 「http://www.○○○.jp/sample/test/★/」を 「http://www.○○○.jp/index.php?p=sample&m=test&y=★」 として認識しているためだと思いますが、 対策がわかりません。 このような場合は、どう対処すればよいのでしょうか。

    • ベストアンサー
    • PHP
  • 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で静的化(PHP)

    ご質問です。 例えば以下のような静的なページをmod_rewriteを使って.htaccessで作成しようとしています。 RewriteRuleの記述内容がよくわからず困っています。 また、.htaccessは、どのディレクトリに配置すればよいでしょうか。 どなたかご存知でしたら教えて下さい。 http://localhost/free/index.php?action=member →http://localhost/free/member http://localhost/free/index.php?action=bbs →http://localhost/free/bbs http://localhost/free/index.php?action=usr →http://localhost/free/usr このような記述をしていますが、ご指摘お願いします。 ---------------------- DirectoryIndex index.php RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9A-Za-z)]+)$ index.php?action=$1 [L] ---------------------- 宜しくお願いします。

    • 締切済み
    • PHP
  • mod_rewriteの書き方について

    よろしくお願いします。 サーバーをhttp://80codeを使っています。 今回、mod_rewriteを使って静的アドレスにしようとしていますが、 404エラー(見つかりません)がでてしまい、うまく表示されません。 設定が間違っていますでしょうか? http://repo.teki2.com/に両方のファイルとも設置しています。 接続しに行っているアドレスは、http://repo.teki2.com/1/ です。 http://repo.teki2.com/index.php?mode=1 だとうまくいきます。 .htaccessの内容 RewriteEngine on RewriteRule ^/([0-9a-zA-Z]+)/$ /index\.php?mode=$1 [L] index.phpの内容 <?php echo $mode; ?> よろしくお願いします。

    • 締切済み
    • CGI
  • mod_rewriteに適用したくないファイルがある場合は?

    RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9A-Za-z_)]+)\.htm$ http://www.****.com/$1.php [L] ↑のようにhtaccessでphpをhtmに見せているんですが、 1.フォルダ内のphpファイルでも一部にこれを適用したくない場合はどのように書けばいいのでしょうか? 2.この.htaccessファイルがある下層のフォルダにはmod_rewriteを適用したくない場合はどのように書けばいいのでしょうか? (.htaccessの効果って下層フォルダにも効いてしまいますよね?) どちらかだけでもいいので、分かる方いらっしゃれば手助けしていただければうれしいです。 よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • 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
  • 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] としていますが上手く出来ていないようです