【Apache】mod_rewriteについて語るスレat PHP
【Apache】mod_rewriteについて語るスレ - 暇つぶし2ch331:nobodyさん
08/11/22 09:55:07 BXxABI2c
>>330
本当にありがとうございます
httpd.confをみると
ServerRoot "C:/Program Files/Apache Group/Apache2"となっています
index.php は Apache2/htdocs/index.php だから
RewriteEngine on
RewriteBase /htdocs/
としてみたんですがapacheが再起動できませんでした。なので、RewriteBaseはやめて
RewriteRule !\.(js|ico|gif|jpg|png|css)$ /htdocs/index.php とした上で
index2.phpにアクセス→NotFound ※本当はあります<?php echo"index2だよ";?> と書いてあります
favicon.icoにアクセス→そのままfavicon.icoを表示
となりました
ダメですよね? ほんらいならどっちもindex.phpに転送されてるはずなんですよね。。

332:nobodyさん
08/11/22 10:01:28
ServerRootがそれだったら
RewriteBase htdocs/
だな。
もしくは
RewriteBase "C:/Program Files/Apache Group/Apache2/htdocs/"

で、RewriteBaseを指定したら起動できなくなるんならログを確認してさ。

そんでだめなら
RewriteRule !\.(js|ico|gif|jpg|png|css)$ "C:/Program Files/Apache Group/Apache2/htdocs/index.php"

333:nobodyさん
08/11/22 10:09:39 BXxABI2c
>>332
RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ htdocs/index.php
に変更してみました!

でも以下のようになりました
index2.phpにアクセス→BadRequest
favicon.icoにアクセス→そのままfavicon.icoを表示
これじゃダメなわけですよねー

mod_rewriteに関連する記述は上に書いただけなんですが(.htaccessもないし)
なんでなんだろう

334:nobodyさん
08/11/22 10:12:52
フルパスは試した?
DocumentRootはどうなってる?


335:nobodyさん
08/11/22 10:25:34 BXxABI2c
>>334
おおお!
RewriteRule !\.(js|ico|gif|jpg|png|css)$ "C:/Program Files/Apache Group/Apache2/htdocs/index.php"
を試したところ、index.phpの内容が表示されました → echo "index.phpです";
(URL的には localhost/index2.php のままなんですがこれでいいんでしょうか?)
しかし、/localhost/favicon.ico にアクセスするとそのままfaviconが表示されます index.phpに移動するんじゃないんでしょうか?

ドキュメントルートは
DocumentRoot "C:/Program Files/Apache Group/Apache2/htdocs" となっています
これは何に関連するんでしょうか?

336:nobodyさん
08/11/22 10:27:38 BXxABI2c
あと、 URLリンク(localhost) にアクセスするとこれも localhost/index.html に
移動します。 system以下はそのまま表示したいときはどうしたらいいんでしょうか すみませんが教えてください
本当にすみません

337:nobodyさん
08/11/22 10:40:37
何をしたいのかわからんので、あとは、自分でドキュメント見て考えてみた方が・・・
URLも変えたいならRオプションでリダイレクトだけど、ループしないように注意。
system以下をrewriteから外したいなら、rewriteCondで除外設定を書く

338:nobodyさん
08/11/22 10:41:09
あぁ、ちなみに俺が書いたrewriteBaseの記述はデマだったので無視してちょ

339:nobodyさん
08/11/22 10:55:16 BXxABI2c
ありがとうございました! ほんとに助かりました!

340:nobodyさん
08/12/14 10:48:10 +j0Og9H5
スミマセン、聞かせてください
mod_rewriteの除外処理が上手くいかないです

RewriteEngine on
#除外処理#
RewriteCond %{REQUEST_URI} !^/admin
RewriteCond %{REQUEST_URI} !^/phpmyadmin
#RewriteBase /htdocs/
RewriteRule !\.(js|ico|gif|jpg|png|css)$ "C:/Program Files/Apache Group/Apache2/htdocs/index.php"
RewriteLog "C:/Program Files/Apache Group/Apache2/logs/rewrite.log"
RewriteLogLevel 9

これじゃ駄目なんでしょうか? adminとphpmyadminを除外したいんですが
よろしくお願いします

341:340
08/12/15 16:53:40
自己解決しました 

342:nobodyさん
08/12/22 21:50:17 i6VX5Oho
hoge(日付).jpgとアクセスされたら(日付).jpgを表示したいんです

RewriteEngine on
RewriteRule hoge(.*)\.jpg$ URLリンク(example.com) [R]

うまく動作しません。どこが間違っているのでしょうか?


343:nobodyさん
08/12/22 22:00:34
うちではちゃんと飛ぶけどなぁ


344:342
08/12/22 22:12:02
ググると「さくらインターネットの.htaccess の RewriteRule の正規表現に互換性がない」
という記事を見つけました。このせいかもしれません
もう少し調べてみます、ありがとうございました


345:nobodyさん
08/12/22 22:16:48
鯖によっても違うのかねぇ。
500 円の鯖で、その2行だけ書いてうまくいったお。


346:nobodyさん
08/12/23 01:20:45
Apache 1.3.x と Apache 2.x でmod_rewriteが違うのかな? PCRE絡み?

347:nobodyさん
08/12/25 22:13:19
mod_rewriteってドキュメントがやたらと説明不足でみんな嵌まるよな。
やることはプログラミング以下の設定ファイルなのに異常な分かり難さ。

348:nobodyさん
08/12/26 05:23:34
ドキュメントに書かれた条件をすべて飲み込んでいれば問題ない。
何を何へ書き換えたいのかを用意された条件を使って組み立てる能力の問題。

349:nobodyさん
08/12/27 12:25:14 CKOvxwPj
みなさま教えてください。
さくらインターネットを利用しております。

URLリンク(hoge.com)
URLリンク(hoge.com) のように解決させることはできたのですが、
ハイフンをスラッシュに変えて、
URLリンク(hoge.com)
URLリンク(hoge.com) のように解決させることができません。
.htaccessの設定は下記の通りです。

■ハイフンの場合
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^aaa-([0-9a-zA-Z_\-]+)$ URLリンク(hoge.com)

■スラッシュの場合
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^aaa/([0-9a-zA-Z_\-]+)$ URLリンク(hoge.com)

よろしくお願いします。

350:nobodyさん
08/12/30 10:15:42
>>349
/
の正規表現での役割を考えればすぐわかる

351:nobodyさん
09/01/20 01:26:28
mod_rewriteが機能しません。

環境
OS:CentOS5
http:apache2

httpd.confには以下の記述をしてapacheの再起動をしました。

LoadModule rewrite_module modules/mod_rewrite.so
RewriteLogLevel 9
RewriteLog /var/log/httpd/rewrite.log

で、/testディレクトリに以下の記述をした.htaccessファイルを設置。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/test/(.*)$ /test2/$1 [L,R]
</IfModule>

この記述をすると本来なら、「http://ドメイン/test/index.html」にアクセスしたときに「http://ドメイン/test2/index.html」にリダイレクトするはずだと思うのですが・・・。
ブラウザには「http://ドメイン/test/index.html」が表示されてします。

rewrite.logを見るとこんな風になってます。
192.168.1.6 - - [20/Jan/2009:17:41:36 +0900] [ドメイン/sid#96db468][rid#9895400/initial] (3) [perdir /home/httpd/html/test/] strip per-dir prefix: /home/httpd/html/test/index.html -> index.html
192.168.1.6 - - [20/Jan/2009:17:41:36 +0900] [ドメイン/sid#96db468][rid#9895400/initial] (3) [perdir /home/httpd/html/test/] applying pattern '^/test/(.*)$' to uri 'index.html'
192.168.1.6 - - [20/Jan/2009:17:41:36 +0900] [ドメイン/sid#96db468][rid#9895400/initial] (1) [perdir /home/httpd/html/test/] pass through /home/httpd/html/test/index.html

なにか設定漏れがあるのでしょうか。
分かる方いましたらご教示のほうよろしくお願いします。

352:351
09/01/21 01:04:18 Xd3Vqa6l
351です。
すいません、上げさせてください。

353:nobodyさん
09/01/21 07:15:29
ログに書いてある通りだよね。
strip per-dir prefix: /home/httpd/html/test/index.html -> index.html

RewriteBaseで、どこがURLのベースなのかを教えてあげたらどうかな。

354:nobodyさん
09/01/21 16:33:47
.htaccessより上の階層のファイルを参照させたいのですが可能でしょうか?
RewriteEngine on
RewriteRule (.+?)\.php$ ../test/$1.php [L]


355:nobodyさん
09/01/21 19:59:03
やってみたの?

356:351
09/01/23 03:43:10
>>353
ご教示ありがとうございます。
アドバイスを参考に以下の記述をhtaccessにすることによって思い通りの動作がすることを確認できました。

RewriteBase /test
RewriteEngine On
RewriteRule (.*)$ /test2/$1 [L,R]

そのときのlogは以下でした。
192.168.0.6 - - [23/Jan/2009:03:37:44 +0900] [ドメイン/sid#856ce38][rid#872f830/initial] (3) [perdir /home/httpd/html/test/] strip per-dir prefix: /home/httpd/html/test/index.html -> index.html
192.168.0.6 - - [23/Jan/2009:03:37:44 +0900] [ドメイン/sid#856ce38][rid#872f830/initial] (3) [perdir /home/httpd/html/test/] applying pattern '(.*)$' to uri 'index.html'
192.168.0.6 - - [23/Jan/2009:03:37:44 +0900] [ドメイン/sid#856ce38][rid#872f830/initial] (2) [perdir /home/httpd/html/test/] rewrite 'index.html' -> '/test2/index.html'
192.168.0.6 - - [23/Jan/2009:03:37:44 +0900] [ドメイン/sid#856ce38][rid#872f830/initial] (2) [perdir /home/httpd/html/test/] explicitly forcing redirect with http://ドメイン/test2/index.html
192.168.0.6 - - [23/Jan/2009:03:37:44 +0900] [ドメイン/sid#856ce38][rid#872f830/initial] (2) [perdir /home/httpd/html/test/] trying to replace prefix /home/httpd/html/test/ with /test
192.168.0.6 - - [23/Jan/2009:03:37:44 +0900] [ドメイン/sid#856ce38][rid#872f830/initial] (1) [perdir /home/httpd/html/test/] escaping http://ドメイン/test2/index.html for redirect
192.168.0.6 - - [23/Jan/2009:03:37:44 +0900] [ドメイン/sid#856ce38][rid#872f830/initial] (1) [perdir /home/httpd/html/test/] redirect to http://ドメイン/test2/index.html [REDIRECT/302]

353さん助かりました。
本当にありがとうございました。

357:nobodyさん
09/01/26 15:02:16
Win上で開発しLinuxで動作させています。
>>265とほぼ同じことをしたいと思っています。

具体的に言うと

/DocRoot→静的なページのみ
 ├.htaccess→RewriteBase / のみ記述
 ├/subDir1→ここに動かしたいCGI
 │ └.htaccess→RewriteBase /subDir1 その他大量
 ├/subDir2→ここにも動かしたいCGI
 │ └.htaccess→RewriteBase /subDir2 その他大量
 :

>>267を試したところ、
HTMLはただしくリダイレクトされたのですが、画像やCSSは読み込まれませんでした。
原因はURL関連が全て/から始まる絶対パスで記述されているため
(Win上ではCGIごとにプロジェクトを分けてるからそれでよかった)なのですが
Ajaxなどの外部ファイルも使っているため
HTMLに手を加えて修正すると、既存のhtaccessとJSを修正しなければならないので
出来るだけサーバーの設定だけで実現したいと考えています。
サブディレクトリをDocRootのように振舞わせる方法をご存知でしたら
ご教授よろしくお願いします。。

358:nobodyさん
09/01/27 12:01:00
htmlの中にかかれたCSSファイルなどはすべて絶対パスになってます?

359:357
09/01/27 16:06:45
はい、なっています。

Apacheのerror_logを見ると、
file does not exist: /DocRoot/css
file does not exist: /DocRoot/images
というエラーログが吐き出されてます。

今回アクセスしてほしいのは
/DocRoot/subDir1/css
/DocRoot/subDir1/images
なので、RewriteRuleが効いていないのかな、といった状態です。

360:nobodyさん
09/01/27 17:46:36
/DocRoot/.htaccess 該当部分見せてください

361:357
09/01/28 12:47:01
/DocRoot/.htaccessは

RewriteBase /

のみです。

こまごまと指定しているRewriteRuleは
/DocRoot/subDir1/.htaccess になります

Options +FollowSymLinks
RewriteEngine On
RewriteBase /subDir1

RewriteCond %{HTTP_REFERER} URLリンク(hogehoge.com)(.*)$
RewriteRule (.*) /subDir1/$1 [R,L]

RewriteRule ^$ /subDir1/foo.html [R,L]
RewriteRule ^foo\.html$ /subDir1/bar.php?str=hoge [L]

こんな感じです。

362:nobodyさん
09/01/28 13:52:14
DocRootへのアクセスをどうにかしたいんですよね?

/DocRoot/css -> /DocRoot/subDir1/css
なら、DocRootの .htaccess に書かないと

/subDir1/xxx -> /subDir1/bar.php?str=xxx のときの bar.phpのcssファイルへのリンクが  /css だとしたら、
/.htaccess にその振り分けを。
そのときに subDir1 なのか subDir2 なのかを振り分けなくてはいけないですが
URLにsubDir1が含まれていそうなので なんとかなるかな。

363:nobodyさん
09/01/28 14:04:18
訂正。 入って無いんだった。
これは難しいのかな。
ブラウザからのアクセスは
URL欄は URLリンク(hogehoge.com) でも  cssファイルへのアクセスは
URLリンク(hogehoge.com) でしかないからね。

364:nobodyさん
09/01/28 14:53:05
mod_rewriteじゃなくて、Aliasで十分なんじゃないの?

365:357
09/01/29 14:23:59
Aliasを試しましたところ、>>363の現象は回避できましたが
複数のサブディレクトリ毎にAliasを設定できないので断念しました。。

結局htmlにbaseタグをつけ全て相対パス表記にして、
jsのほうはdocument.baseURI要素を見てリクエストURIに追加する方法をとることにしました。
いろいろ勉強になりました。ありがとうございます。

366:nobodyさん
09/02/01 21:14:36 xTHPhmiR
public_html/index.phpにアクセスされたらindex_new.phpに移動させたいのですが
うまく動きません
どなたかご教授お願いいたします

RewriteEngine on
RewriteRule .index.php$ /index_new.php [R=301,L]
RewriteEngine off


367:nobodyさん
09/02/02 10:49:03
/.index.phpへのアクセスで動いてる?

368:nobodyさん
09/03/02 05:54:17 Xc+NjhEh
hoge.php?param=123

/hage/param/123
とやりたいんですが、

RewriteRule ^hoge\.php\?param=(.*)$ ./hage/param/$1 [R]

hoge.php?param=123 (そのまま何も起こらず)

となってしまいます。
後ろの方から少しずつ削っていくと、ここまで削った所で以下のように動きます。

RewriteRule ^hoge\.php(.*)$ ./hage/param/$1 [R]

/hage/param/?param=123

多分、?のエスケープがうまくいってないようなんですが、どうしたもんでしょうか。

369:nobodyさん
09/03/02 05:55:14
普通逆じゃないか?

370:nobodyさん
09/03/02 07:05:46 Xc+NjhEh
事情があって、もとがベタベタPHPだったんだけど
今回FWかまして作り直すことになって、
でもSEOとかブックマーク入れてる人とかを考慮するために、
URLは元と同じじゃないと駄目だからってことになって、
やむにやまれずこんな方法でやるしかないかなと。
FWのコントローラ側をいじってもなんとかできることはできるんだけど、
今後のセキュリティアップデート考えるとFW自体はいじりたくないので。

371:nobodyさん
09/03/03 04:43:10
色々やってはみたもののどうも無理そうなのでFWのルータいじります
rewriteって特殊文字のエスケープ周り甘いのかなぁ

372:nobodyさん
09/03/03 10:28:42
RewriteCond %{QUERY_STRING} ^param=(.*)$
RewriteRule ^hoge\.php$ ./hage/param/%1? [R]
試して無いが


373:nobodyさん
09/03/27 14:47:48
すみませんが、質問です。

CakePHPを使っているのですが、あるアプリケーションで、フロントコントロー
ラであるindex.phpを、一般画面用と管理画面用との2つ用意したいのです。

www(ドキュメントルート)
|
+ index.php(1. 一般画面用)
|
+ admin
     |
     + index.php(2. 管理画面用)

そして、http://ドメイン名/admin/... となったリクエストだけ、2.の管理画
面用index.phpに渡すようにしたいのです。

http://ドメイン名/hoge → index.php?hoge (1.の一般画面用)
http://ドメイン名/hoge/fuga → index.php?hoge/fuga (1. の一般画面用)
http://ドメイン名/admin/hoge → index.php?hoge (2. の管理画面用)
http://ドメイン名/admin/hoge/fuga → index.php?hoge/fuga (2. の管理画面用)

このように指定するには、.htaccessにどのように指定したらよいでしょうか?


374:nobodyさん
09/04/03 13:14:38 nlrPhi8T
URLリンク(hogehoge.ero) => 404error!
URLリンク(hogehoge.ero) => OK!

となるんですが、/index.php/ を消す方法はないでしょうか?
 
今はこんな感じになってます

RewriteCond %{REQUEST_URI} ^(/component/option,com) [NC,OR] ##optional - see notes##
RewriteCond %{REQUEST_URI} (/|\.htm|\.php|\.html|/[^.]*)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php




最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch