【Apache】mod_rewriteについて語るスレ
>>377 RewriteBase / ↓ RewriteBase /~hoge/ に変えてみ。 >>378 ありがとうございます。 要因が2つありましたが、そのうちのひとつでした。 助かりました。 フレームワークをつかってて以下のような書き方をしてるんですが、 http://hoge.hoge.com/ にアクセスした場合、ブラウザだと表示されますが、 wgetをしてみると404になってしまいます。そのせいか、Yahooにクロールリクエストしようとしても 404ですといわれてしまいます。どこがおかしいかわかりますでしょうか? http://hoge.hoge.com/ は実際は http://hoge.hoge.com/index.php/ 引数/ みたいな感じになってます <IfModule mod_rewrite.c> RewriteEngine On # uncomment the following line, if you are having trouble # getting no_script_name to work RewriteBase / # we skip all files with .something RewriteCond %{REQUEST_URI} \..+$ # RewriteCond %{REQUEST_URI} !\.html$ RewriteRule .* - [L] # we check if the .html version is here (caching) RewriteRule ^$ index.html [QSA] RewriteRule ^([^.]+)$ $1.html [QSA] RewriteCond %{REQUEST_FILENAME} !-f # no, so we redirect to our front web controller RewriteRule ^(.*)$ index.php [QSA,L] </IfModule> http://hoge.com/ 西村ひろゆき/2ch管理人 を http://hoge.com/index.php?name= 西村ひろゆき&site=2ch管理人 に飛ばそうとしています。 RewriteRule ^/([^/.]+?)/?(/.*)?$ /index.php?name=$1&site=$2 [L] としていますがapacheの再起動をするとうまくいきません。。。 RewriteRule ^/([^/.]+)/?(/.*)?$ /index.php?name=$1&site=$2 [L] スラッシュの前の最小マッチに必要な?をぬくとapache再起動をしとりあえず 動くのですが、、最小マッチしないと一部うまくいかないため、 どうすればmod_rewriteで最小マッチできるか教えてください m(_ _)m apache2.0と2.2で処理変わった? 同じ式で悪禁がうまくいかないんだけど死ね 301でサイト移動をする場合に関数に色々な値があるのをそれぞれリダイレクトさせたい場合 一挙に書くにはどうすればいいでしょうか? 1つ1つ書くと下記のようなのを1つにしたいです。 Redirect 301 /index.php?a=1 "http://www.example.jp/index.php?a=1 " Redirect 301 /index.php?a=2 "http://www.example.jp/index.php?a=2 " Redirect 301 /index.php?a=3 "http://www.example.jp/index.php?a=3 " ・ ・ ・ Redirect 301 /index.php?a=a1 "http://www.example.jp/index.php?a=a1 " Redirect 301 /index.php?a=b2 "http://www.example.jp/index.php?a=b2 " Redirect 301 /index.php?a=c3 "http://www.example.jp/index.php?a=c3 " ・ ・ ・ >>386 君、質問する前に少しは人の忠告を聞きなさい 別スレで親切に諭してくれた人がかわいそうだ >>387 ちゃんと聞いてるよ。example.jpに直してるだろ。(ココは妥当な意見だと判断したので) 「マルチ質問扱いされて厄介な・・・」って部分は そんなのどうでもイイと判断して無視した。 聞く立場だからって、言われたことに何でも従う訳じゃない。 自分で考えて「合理的だ」「その通り」と感じた意見だけに従う。 ルート直下にaaaというディレクトリがあり、このディレクトリ以下のディレクトリにへのアクセスをルートのindex.phpに飛ばしたいのですが、 aaaに以下のように書いた.htaccessを置いてみたところ、http:// 〜/aaaの場合はうまくいくのですがhttp:/〜/ aaa/の場合がうまくいきません。 どうしたらいいでしょうか? RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} -d RewriteRule . /index.php [L] RewriteCond %{REQUEST_URI} ^/aaa RewriteCond %{REQUEST_FILENAME} !-f RewriteRule . /index.php [L] をルートの.htaccessに追記したところ成功しました 置く場所からして間違ってましたねすみません… 質問です。 mod_rewriteを使うと以下のことができるでしょうか? http://example.com/ にアクセス。 サーバ内部では、http://example.com/cig/top.cgi にアクセス。 ただし、ブラウザのURLはhttp://example.com/ のまま。 ページ内のリンクをクリック。 サーバ内部ではhttp://example.com/cig/next.cgi にアクセス。 ただし、ブラウザのURLはhttp://example.com/ のまま。 ということが可能なんでしょうか? つまり、ブラウザで表示するURLだけを書き換える、ということです。 mod_rewriteだけじゃ無理だと思う。 最初にhttp://example.com にアクセスがあった時、top.cgiとnext.cgiのどっちへのアクセスかどうやって振り分ける? http://example.com へのアクセス全部index.cgi行きにして、何かの環境変数(セッションとかリファラとか)top.cgiの処理か next.cgiの処理を内部的に(includeとか)で呼ぶぐらいしかできないと思うよ。 なるほど。top.cgiはディレクトリインデックスのイメージでした。 逆はできるみたいですけどね。URLを変えずに表示ページを変える。 ん? 逆だと「表示されるページを変えずにURLを変える」になると思うが。 /q/{任意の文字列} というリクエストを /q?query={任意の文字列} にリダイレクトしたいので、 RewriteRule ^/q/(.+)$ /q/?query=$1 としました。 しかし、{任意の文字列}は、ただの文字列の場合もあれば、 "?を含むURL"の場合もあり、後者の場合は?の前までしか取得できませんでした。 ちなみに"?を含むURL"の?の後のクエリは不定です。 RewriteCond %{QUERY_STRING} でなんとかなるかと思ったのですが、クエリがあったりなかったりする場合どのようにかいて良いのか わからなくなってしまいました。 どなたかご教示いただけないでしょうか。よろしくお願いします。 3行目は /q/?query={任意の文字列} の間違いです。 失礼しました cgiでページを表示しているんですが、「index.cgi?hoge=num」の 「index.cgi」部分を常に表示しないようにしています。 しかしフォーム投稿を繰り返すとブラウザにこの「index.cgi」が 出てしまうことがあるので、常にこの文字列を省略する方法は無いかと調べ、 mod_rewriteでそれらしいことが出来るのではと思い、お尋ねしたく…。 現在 RewriteEngine on RewriteRule ^index\.cgi(.*)$ /$1 [R=301] と書くと「処理がループしています」というエラーが出てしまいます >>401 回答どうもです。 ポスト先をディレクトリというのは 読み込むデータをディレクトリに入れとけ、ってことですか? だとしたら、データはdat形式でディレクトリに格納してあります >>402 ちゃうちゃう 今 <form action="./hoge/index.cgi" method="post">〜 と書いてるなら <form action="./hoge/" method="post"> と書けってこと。 ありがとうございます とりあえずそう処理しておきました ちなみにmod_rewiteで修正する場合どう記述すればよいかわかりますか? お世話になります。Kernel 2.6.18, Apache 2.2.3, PHP 5.1.6 です。 拡張子なしで呼び出された URL を同じ場所にある PHP に向けたいんですが、 サブディレクトリを含めた汎用的な書き方は可能でしょうか? 次のように PATH_INFO がついている場合でも、それを維持してファイル名の 部分だけを書き換えたいのですが。 /basename → /basename.php /sub/directory/basename → /sub/directory/basename.php /basename/ → /basename.php/ /basename/path/info → /basename.php/path/info /sub/directory/basename/path/info → /sub/directory/basename.php/path/info サブディレクトリ、PATH_INFOに含まれる "/" の数は固定ではなく、途中に "." (拡張子風の ".") を含む可能性があります。 "basename.php" と "basename" のように拡張子の有無だけが異なるファイルや ディレクトリが同じ場所に存在することはありません。 >>404 rewiteしなくてもAliasひとつでいけね? >>400 の設定でループするのは オプションにLつけて終わらせてないから延々と書き換えてる >>405 phpのファイル名が限定されるなら後方参照使うだけでいくつか書けばいけるだろ ttp://httpd.apache.org/docs/2.2/rewrite/rewrite_guide_advanced.html www.test.com/hoge/ を hoge.test.com/ にする書き方って どうすればいいでしょうか。てかそもそもこういうのって 出来るのかな?っていう。 >>409 それmod_rewriteじゃなくてmod_proxyじゃね? 素直にサブドメイン作ろうぜ 作れないならあきらめようぜ どもです。hogeというホスト自体は設定してあるんです。 www.test.com/hoge1/ www.test.com/hoge2/ って感じにディレクトリが分かれていて バラバラのコンテンツが入っています。 これをhoge1.test.com/という風に別々のサイトのように見せたいと思っていてhttpd.confを 編集しました。 現状ですとwww.test.com/hoge1/でもhoge1.test.com/でも同じ内容が表示されるのですが SEO的によろしくないということで(スパム扱いされたりするとか)すべてhoge1.test.com/に 統一したいんです。 www有りとwww無しのアクセスを統一したりというのをmod_rewriteで出来たと思うので こういう書き換えも可能なのかなと。 あ、補足です。 ディレクトリを移動しない理由を書いていませんでした。 CMSのCGIが入っているんので移動すると更新が出来なくなってしまうのです。 SEO的にってことは、http://www.test.com/hoge1/fuga にアクセスしたら http://hoge1.test.com/fuga にリダイレクトされた方がいいんだよね。 hoge1 だけでよければ RewriteCond %{REQUEST_URI} ^/hoge1 RewriteRule ^/hoge1/(.*)$ http://hoge1.test.com/$1 [R] でいけそうだけど、www.test.com 以下のディレクトリ全部に 自動的に対応させたいってのはどうするのかな。 あと、こういう例題ドメインには example.com とかを使った方がいいよ。 >>414 ありがとうございました。 各コンテンツの中は相対パスで書かれているのでその記述で対応可能でした。 example.com<了解っす。感謝。 Thanks to blogging and online social networking, they are quick to share their knowledge and opinions with one another. , The crush I could always fall back on, no matter how much time had passed. , ttp://hogemoge.com/check.phpを ttp://hogemoge.com/check/http://foo.jp/bar/baz/ でアクセスする方法をどなたか教えてください。 check.phpのみ適用されるようにしてください。 http://foo.jp/bar/baz/ のところはいろいろ変わります。 http:// をhttp:/と解釈されないようにしてください。 checkの部分を変えてもcheck.phpに当たるようにもしてください。 よろしくお願いします。 >>418 やりたいことが意味不明なんだが、 http:// を含むリクエストがあったら、それをcheck.phpに回すだけでよくないか? それなら、 RewriteRule ^.+/http(:|%3A)//.*$ /check.php [NC,L] あとは、$_SERVER['REQUEST_URI']をcheck.phpで確認する、でどうかね。 で、http:// をhttp:/と解釈してしまうのはアプリケーション上のことであって、 mod_rewriteはそんな仕事はしない。 ブラウザでアクセスしようとするとコロンがエンコードされて%3Aで送ることがある >>420 http://hogemoge.com/check/http ://foo.jp/bar/baz/ とやってみたがNot Foundだった。なぜだろう Not Found The requested URL /check/http://foo.jp/bar/baz/ was not found on this server. って。 ログ見た? ところで、 RewriteRule ^.* /check.php [NC,L] これなら、正常に表示される? で、順にhttpとか//とか試せば URLを書換えてから、クエリー部分をそのままphpに渡すつもりです http://localhost/input.php?action=submit&id=111 だったら、 request.php?action=input.php&query=(ここにaction=submit&id=111を示す文字列を書きたい) みたいな事をしたいです 425は偽。俺が本物か証明できるかどうかはわからんがトリップをつける IIJがアク禁になって当分投稿できなかった。すまない。 >>423 # cat /var/log/httpd/access_log 192.168.56.1 - - [28/Oct/2009:23:40:43 +0900] "GET /check/http://foo.jp/bar/baz/ HTTP/1.1" 404 314 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) Pathtraq/0.9" # cat /var/log/httpd/error_log [Wed Oct 28 23:40:43 2009] [error] [client 192.168.56.1] File does not exist: /var/www/html/check RewriteRule ^.* /check.php [NC,L]にしたらInternal Server Errorになった # cat /var/log/httpd/access_log 192.168.56.1 - - [29/Oct/2009:07:19:07 +0900] "GET /check/http://foo.jp/bar/baz/ HTTP/1.1" 500 613 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) Pathtraq/0.9" # cat /var/log/httpd/error_log [Thu Oct 29 07:19:07 2009] [error] [client 192.168.56.1] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace. なんかerror_logの方は記録できなかったっぽい? > RewriteRule ^.* /check.php [NC,L]にしたらInternal Server Errorになった それ、.htaccessに書いてる?httpd.confに書いてる? RewriteRuleで複数書き換えると無限ループすることがあるよ。 特に.htaccessのとき。 単発の質問を偽物扱いして退けようとするなんてかっこいいなw >>428 .htaccessに書いてた・・・ httpd.confなら <Directory /var/www/html> RewriteEngine On RewriteRule ^.* /check.php [NC,L] </Directory> 的なことを書けばいいんだよね? <Directory>に書いたら、ディレクトリコンテキストだから基本的に一緒 ディレクトリコンテキスト外で書いた方がループしない。 ループするのとは直接関係ないかもだけど、実ファイルがあったら書き換えないっていう指定も追加するといい RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} .ico$ [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] 誘導されて来ました。 早速質問なのですが、 test.phpというファイルがリクエストされた場合に、index.php?page=test.phpにrewriteするにはどのようにすれば良いでしょうか? .htaccessに RewriteRule ^([0-9A-Za-z.]+)$ index.php?page=$1 [L] と記述してみたのですが、$_GET["page"]の値がindex.phpになってしまいます。 拡張子をtest.htmlにすると上手くいくのですが。。。 よろしくお願いします。 index.phpへのアクセス → index.php?page=index.php になってるんじゃないの? RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([0-9A-Za-z.]+)$ index.php?page=$1 [L] >>432 あと、オプションをQSAにしてみたら? >>433-434 遅くなりまして申し訳ないです。 期待していた通りに動作しました。ありがとうございました。 日本語をURLエンコードしているんだけど、それを半角英数に書き換え戻したいんだが。 無理だな。 携帯端末以外からのアクセスをIPで弾いてるのだけど… PCからのアクセスの場合どこに飛ばしたものか苦慮してる。 そこでhtaccessの挙動がまだよくわからんのだけど、 htaccessって最後まで読まれてから、その全ての記述が実行されてるんでしょうか。 それとも、上から順番に実行していって、例えば RewriteRule で [L]を末尾につけた場合はそこで処理がとまったりするんでしょーか。 設定ファイルに書かれた順序を考慮して動作するモジュールがあるというだけで、 設定ファイル自体はスクリプトではないので最後まで読まれます。 まさかApacheスレを探していて、質問しようと思っていた項目専用のスレがあるとは・・・ 今後宜しくです >>1 のリンクをザッとみて良く分からなかったのですが、 RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php の !\.(js|ico|gif|jpg|png|css)$ の部分の意味が良く分かりません PHPやJavaScriptとは違うようですし、正規表現のような気もしません これら! \ $の文字は言語で言うと何に分類されるのでしょうか? Apacheは専門的に勉強したことがないのですが、Apache専用の言語(演算子)なのでしょうか? RewriteCondの書き方でわかる方いたら教えてください 「base/pic」に入ってる画像のみ、rewriteしたくて、ほかはそのまま 表示したいのですが、どう書けばいいでしょうか? RewriteCond %{REQUEST_URI} !^.+\.(gif|jpg|jpeg|png)$ ですべての画像を弾くのはできそうなんですが… RewriteCond %{REQUEST_URI} base/pic.+\.(gif|jpe?g|png)$ /dummybase/pics0001.gif も条件に当てはまるけど。 >443 遅くなりましたが ありがとうございます! Redirect済みかどうかの判定ってできないんでしょうか? ブラウザ上では /main/ が / になるように、301でリダイレクトしたいんですけど、 内部的には / を /main/ にしたくて / でも /main/ でも同じページが返されるようにしたいんです。 現状 ↓ RewriteRule ^/*main/?(.*)/*$ $1 [L,R=301,QSA] RewriteRule ^$ main/ [L,QSA] これだと無限ループになるんで、上のルールがリダイレクト済みなら評価しないっていうことが できればなあと思っています。 内部リダイレクトはNSフラグによるサブリクエストにはならないようですし、 REMOTE_ADDRでアクセスした時のURLがわかればと思ったけど それも内部リダイレクトで上書きされてしまうようでお手上げになってしまいました。 設計の問題だと思うけど。 例えば/index.cgiとか何らかのスクリプトを経由して /main/index.htmlを表示するようにバイパスすればいーんじゃねーの。 mod_headerでダミーのヘッダをセットして2度目かどうかをチェックっていうのがあったな。 クライアントが変態でそのヘッダを自前で付けてきたら違う動作するだろうけど。 レスありがとうございます。 >>448 で一考したんですが、同等の考え方で、どうせQSAつけてるんだしって思って ?redirected=1みたいなクエリ付けてその判定を利用することにしました。 RewriteRule ^s/?f=([0-9A-Za-z)]+)$ /search/?f=$1 [L] と書いたら、表示は出来ますが関数が無効になっています。 RewriteRule ^s/([0-9A-Za-z)]+)$ /search/?f=$1 [L] の場合では、関数が有効になっています。 出来れば「?f=」の形にしたいのですが、どうすれば良いでしょうか? >>451 「全くその通りだ」と思って下の様に変更したのですが、変化がありません。 何か間違っていますか? RewriteRule ^s/\?f=([0-9A-Za-z)]+)$ /search/?f=$1 [L] URLの?以降はRuleではマッチしないから、CondでQUERY_STRINGとマッチしておいて Ruleで%数字の参照を使って値を引っ張るとさっさと教えてやれw QSAフラグでもいいと思うよ Query String Appendって意味 って誰か教えてあげて /username/test.phpにアクセスしたときにサーバー上の/u/s/e/username/test.phpにアクセスさせるようにするにはどうすればいいでしょうか? 文字列を一文字ずつにディレクトリを分解しておきたいのです。 (.)(.)(.)(.*) を $1/$2/$3/$4 とか >>459 ありがとうございます ((.)(.)(.).*) $2/$3/$4/$1でいけました >>460 何かいい方法があれば教えてくださいませんか 一つのディレクトリに詰め込むとすると数万から数十万のファイルやサブディレクトリを作ることになりそうです 数万のファイルやディレクトリが1か所にあると 操作が非常に重くなって使いものにならなくなる まあ最近のOSのファイルシステムならあまり心配いらないのかもしれないね 環境書いてないからそんな前提入れられないけど CUIどころかそのディレクトリのファイルの一つをプログラムから 読みに行こうとするだけで重くなる。SunOSの古いやつだけど もし持ってたらやってみるといい FC2のブログも画像ファイルはユーザ名の頭三文字を1字ずつディレクトリ作ってるね まさかURL上だけ分けてるってことはないだろうけど 例えばext2/3だとサブディレクトリの数は32,000個までという制限がある また、1ディレクトリのファイル数も実用上1万程度が限界点となっている そういうFSでは458みたいな工夫が必要になるわな http://hoge.example.com/ にアクセスしたら /home/test/public_html/common/index.php?sub=hoge とするにはどうすればいいのでしょうか? httpsのみrewriteできないんだけど、そんな設定とかあんのかな? これはhttp→httpsにしてくれるけど、 RewriteCond %{SERVER_PORT} !^443$ RewriteCond %{REQUEST_URI} (^/aaaa.php.*$) RewriteRule /(.*)$ https://% {HTTP_HOST}%{REQUEST_URI} これはhttps→httpにしてくれない RewriteCond %{SERVER_PORT} ^443$ RewriteCond %{REQUEST_URI} !(^bbbb.php.*$) RewriteRule /(.*)$ http://% {HTTP_HOST}%{REQUEST_URI} httpにしてくれないどころか、適当なRewriteRule書いても反応して くれてないんで、RewriteCond %{SERVER_PORT} ^443$ で https を 捕まえてくれてないっぽい。{HTTPS} on|of でもダメでした。 なにがまずいのか、誰かボスケテ。 %{SERVER_PORT}が443になってるかどうかは確認した? >>481 オス。 ssl.conf に Listen 443 httpd.conf に Listen 80 ssl.confはちゃんと読み込まれてる。 別件でパケットキャプチャ使ったんだけど、ちゃんと80、443で動いてるみたい。 なんだろうなー。よく解ってない人が管理してたサーバーの引継ぎで散々苦労 したんだけど、これが片付けば一段落つくのにドン詰まり; 念のためにPHPから echo $_SERVER['SERVER_PORT'] で出してみた。 http,https、それぞれ80,443 になってる。 いや、そのrewriteルールに到達してない可能性があるんじゃない? rewriteLogを確認するか、 RewriteCond %{SERVER_PORT} ^443$ のところで、環境変数にでも入れて、その行に来てるかどうかを確認してみたらどうかなと。 よくあるのは、httpのvirtualhostとsslのvirtualhostを分けてて、 そもそも、sslのときはそのルールは適用されてないとかね。 >>484 返答ありがと。 rewrite_log確認しました。 >480 の記述で、 httpの時は RewiteRule の apply pattern がふたつ出力された後に httpの時のRewriteCond の評価やってるけど、httpsの時は何も出力 されない。 RewiteRuleの時点でひっかかってくれてないな。 他の記述を全部とっぱらって、 ^443$ 関連の記述のみにしても、なにも 出力されてない。パッと見では https の時はガン無視して素通りされて るような感じなんだよなー。 人が設定したモンなんでもしやと思って virtualhost も確認してみたけど、 それは無かった。 なんだろう??? > パッと見では https の時はガン無視して素通りされてるような感じなんだよなー。 その通りだろう httpsの時はallowoverrideがNoneとか >>487 .htaccess は使わずに httpd.conf に書いてる。 >>489 んー、conf.d とこのファイルも怪しいな。 も一回確認してくる =3 /index.html /m/index.html htaccessを使用して 見た目上のURLは変えずに PCからなら /index.html 携帯からなら/m/index.html に飛ばすことは可能でしょうか? RewriteEngine On RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP\.Browser|J-PHONE|Vodafone|SoftBank) RewriteRule ^$ /m/ [R] これだと携帯でアクセスすると見た目上のURLが/m/になってしまいます。 ご教授お願いします。 mod_rewriteの設定について mod_rewriteの設定について 現在 *.test.example.comへのアクセスはドキュメントルートが/home/homepage/public_html/ になっています。 サブドメイン名でアクセスするディレクトリを変更したいです。 例) xxx.test.example.com → /home/homepage/public_html/xxx/ yyy.text.example.com → /home/homepage/public_html/yyy/ 以下のように設定してみたのですが、思い通りにいかない事がいくつかあります。 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_HOST} ^[a-z]+\.test\.example\.com$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+) %{HTTP_HOST}$1 [C] RewriteRule ^([a-z]+)\.test\.example\.com(.*)$ /$1/$2 </IfModule> http://xxx.test.example.com/index.html → ○ http://xxx.test.example.com/ → ×(index.htmlが表示されて欲しい) http://xxx.test.example.com/img/img.jpg → ×(/xxx/img/img.jpg は存在します) 分かる方よろしくお願いします。 最初のはDirectoryIndexで再投函されたあとの挙動だろうけど 下の方は、xxx以下にrewriteしてから、-fチェックをするようにしてみたら? それ、mod_vhost_alias使った方がいいんじゃね? example.com/aaa.php?x=1&y=2 これを example.com/bbb/?x=1&y=2 にURLを書き換えたいのですがうまくいきません。 どう書けば良いでしょうか?よろしくお願いします。 /aaa.php /bbb/ [L] と,テストもせず勘でレスしてみる >>498 ありがとうございます。うまくいきました。 最後にもう1つだけ質問させてください。 example.com/aaa.php?x=1 これを example.com/bbb/?y=1 に書き換えたいのですがよろしくお願いします。 xをyに書き換えたいです。 それ意味あるのかね ぱっと分からんけど,できそうだからこのへん見てみたら? http://httpd.apache.org/docs/2.2/ja/mod/mod_rewrite.html Modifying the Query String のとこ。英語だけど http://test.com/old/ というディレクトリを http://new.com/ として下位のディレクトリもそのまま 転送したいのですが、どう設定したらいいんでしょう? うーん。エラーばっか・・・orz すいません、 httpsでアクセス時に、特定のURLを除いて全てhttpにリダイレクトするようにしたいのですが、 どのような書き方をすればよいでしょうか?調べたのですが分からなくて・・ 教えていただけると嬉しいです。 無限ループで困っています。 やりたいこと HTML5対応のブラウザで自宅のファイルサーバの中にある mp4動画ファイルを独自に設置したプレイヤーで再生する。 やったこと mp4が置いてある場所をmod_autoindexで表示させる mp4ファイルがクリックされたらphpに飛ばしてプレイヤーのHTMLを生成 上記のmp4ファイルがクリックされたらphpに飛ばす。という部分を mod_rewriteで実現しようと、.htaccessに以下のような記述をしました。 RewriteEngine On RewriteRule (^.*\.mp4$) video.php これによりhoge.mp4がクリックされたらvideo.phpで <video src='hoge.mp4'>と展開されますがこのsrc='hoge.mp4'が 無限ループの原因のようです。 よろしくお願いします pathを限定すればいいと思う <video src='./hoge.mp4'> として RewriteEngine On RewriteRule (^[^\.]+.*\.mp4$) video.php > これによりhoge.mp4がクリックされたらvideo.phpで > <video src='hoge.mp4'>と展開されますがこのsrc='hoge.mp4'が > 無限ループの原因のようです。 まんまやん。 展開したファイルで自分にリクエストが来るんだから、 video.php からvideo.phpを呼んでいるようなもの。 mod_rewirteじゃなくてロジックを見直したら? hoge.mp4?m=d などとパラメータ付きのアクセスの時はvideo.phpに飛ばさないというルールを付ければ? http://www.hoge.com/dir/index.cgi?cat=0&page=1 ↑このアドレスを、↓このように書き換えたいのですが、 http://www.hoge.com/dir/0/1 &page=1の部分が上手く渡せていないらしく、上手く表示できません。 (page=1が2ページ目、何もない場合は1ページ目) 1ページ目のhttp://www.hoge.com/dir/0 は表示できます。 .htaccessの添削をお願いします。 現在の.htaccessは以下の通りです。 DirectoryIndex index.cgi RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #RewriteBase /dir/ (現在コメントアウト) RewriteRule ^(.*)$ index.cgi?cat=$1 [L] RewriteRule ^(.*)/(.*)$ index.cgi?cat=$1&page=$2 [L,QSA] 使用しているサーバはxreaで、お金を払って広告を消している状態です。 あー、今できました。 ([0-9]+)これでした。。。。 スレ汚し失礼しました。 RewriteRule ^/news/(20[0-9][0-9].*)$ /cgi-bin/news?file=$1 これは動くんだが、反対に RewriteRule ^/cgi-bin/news?.*?file=(....).*$ /news/$1 にすると動かない。 リライトする前の元のURLがCGIの動的ページの場合の引数を変数に格納するにはどうしたらいいの? 書き方が違った、動かないのは RewriteRule ^/cgi-bin/news.*?file=(....).*$ /news/$1 ちなみにPerlのスクリプトとして、 $line=~ s/news.*?file=(....).*$/news\/$1/; とするとちゃんと動く。 Rewritehではcgiとかの引数部分の?以降の行をマッチさせることはできないよ。 質問させてください やりたいことは www.aaa.com/hoge/○○.php?id=123 にアクセスがあった場合 /home/user/public_html/test/○○.php?id=123 に移動させて ○○.phpで name=hoge id=123 と表示させたい ○○.phpはindex.phpやmail.phpなど色々対応させたい です。よろしくお願いします。 phpベースのサイトを運営しているのですが、SEO対策のためにサイト全体をhtmlとして動作するように変更したいと考えて います。※サイト上にはphpファイルしか置かない。(htmlファイルは設置しない) 具体的には以下のようにしたいと考えています。 ※サイト上に設置している「phpinfo.php」の表示を例にあげています。 1.htmlアクセス(http://phpinfo.html )を、phpにリライトする。 つまり、URLは「http://phpinfo.html 」のまま 「http://phpinfo.php 」 の実行結果を返す。 ------------------------------------ RewriteRule (.*).html$ /$1.php [L] ------------------------------------ 2.phpアクセス(http://phpinfo.php )を、htmlにリダイレクトする。 つまり、URLが「http://phpinfo.html 」となり、 「http://phpinfo.php 」 の実行結果を返す。 ------------------------------------ RewriteRule (.*).php$ /$1.html [R=302,L] ------------------------------------ 上記の対応を実際してみたのですが、なぜかリダイレクトがループしてしまいました。 1.と2.のどちらか一方のみであれば正常動作するのですが、両方記述するとリダイレクトがループします。 原因と対処法をご存知のかたがおられましたらお手数ですがご教授よろしくお願いいたします。 ケース2やらないとPHPのほうをGoogle先生にインデックスされちゃったら若干評価下がりそうだよ rewriteRuleだけじゃ無理かもね RewriteCond を組み合わせればなんとかなるかも知れない。具体的に書けてないですが Lが付いてるからループせずに止まりそうな気もするけど… RewriteLogにはやっぱり延々と出続けるんだよな。 [L] で書き換えは止まるけど書き換えたリクエストがまた来てぐるぐる。 要件どおりならphpファイルを全部 \.html$ にリネームして(ソースの該当個所等も書き換え) これで済むような。 AddHandler application/x-httpd-php .html 勝手に処理変えるの止めて欲しい 昔のバージョンのconfが間違った動きするのでムカつく httpd.confの<VirtualHostの中にRewriteCondとRewriteRuleを 書いても何も変化がないのでそもそもmod_rewriteが機能してるかどうかが 不安になってきた・・・。どの環境でも必ず動くテスト確認みたいなのってないですかね? RewriteEngine on RewriteRule ^/(.*)$ http://www.google.com/$1 [R=301,L] これでグーグル飛ばなかったから動いてないな。。。 二段リライトって使えたっけ? 一度リライトして偽装してるURLを、 もうちょい見通し聞くように書き換えたいんだけども。 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^entry/(.+)$ hoge.php?id=$1 [L] としてたとして、 entry/〜へのアクセスをrenew/〜に遷移させるみたいな。 新規アクセスは書きなおすだけでいいけど、クローラーとか旧リンクへのアクセスが死んじゃう。 RewriteRule ^renew/(.+)$ hoge.php?id=$1 [L] RewriteRule foo.php pplog2/index.php [L] pplog2のフォルダにfoo.phpからアドレスを変えずに読み込みたいのですが、 やると、pplog2/index.phpないの相対パスがくずれてます。 fooのアドレスでpplog2/index.phpを正常に動作させる方法はあるでしょうか? 目的は、pplog2内のファイルをpplog2内に封じ込めるためです。 トップのフォルダにはfoo.php(indexです。)以外のスクリプトファイルを pplog2内におさめたくおもっています。 もしかして、 index.php に HTML の BASE を設定すればいいのかもしれない。 >もしかして、 index.php に HTML の BASE を設定すればいいのかもしれない。 ヒントありがとうございます。 調べてみます。 >>538 神としか言えない。 一歩前にすすみました。 チョットスレチですが、apacheのスレが見当たらなかったもので。。。質問失礼します。 error_logにrefererが強制的に入ってるんですけど、これって、Apacheのデフォルトなんでしょうか? httpd.confを見たのですが、特にログ周りはデフォルトのままのようで。 Server version: Apache/2.0.64 Server built: Mar 7 2011 23:10:31 です。どなたか分かるかたいらっしゃいましたら、よろしくお願いします。(´・ω・`) チョットスレチですが、apacheのスレが見当たらなかったもので。。。 >>150 のようなことを実現したいのですがうまくいきません…… やりたいこと http://example.com/function/test1:aaa/test2:bbb/test3:ccc ↓ http://example.com/funtion.php?test1=aaa&test2=bbb&test3=ccc ※ hoge:hage のパラメータ数は変わることがあり、コロン左側のパラメータ名も変わります。 150の URL末尾が.htmlである点が、先頭の/function/に変わったようなものなのですが、 RewriteRule ^function/([^:]+):([^/]+)$ function.php?$1=$2 [L,NC,QSA] RewriteRule ^function/([^:]+):([^/]+)/(.+)$ function/$3?$1=$2 [N,NC,QSA] と指定すると無限ループに陥ってしまいます…… よくわからないけど RewriteLog 有効にして追ってみるとだいたいわかるんじゃないかな。 >>548 言葉足らずですみませんでした。よろしければ教えてください。お願いします。 >>549 RewriteLog追ったのですが [rewrite/sid#1975720][rid#3bbce98/initial] (3) split uri=function/test1:aaa/test2:bbb/test3:ccc/test1:aaa/test2:bbb/test3:ccc?test3=ccc -> uri=function/test1:aaa/test2:bbb/test3:ccc/test1:aaa/test2:bbb/test3:ccc, args=test3=ccc&test2=bbb&test1=aaa と逆に増えていってしまってるという点までは把握できたものの、 どの記述を調整すればうまく嵌まるのかよく見えていない状態です。 偉そうに言った>>548 は大抵このあとレスしない法則。 たら偉ぶりたかっただけw 分かる方居ませんか…… まだ試行錯誤しつつ悩んでいます RewriteEngine On RewriteLogLevel 3 RewriteRule ^/function/([^:/]+):([^:/]+)$ /function?$1=$2 [L,QSA] RewriteRule ^/function/([^:/]+):([^:/]+)(/.+)$ /function$3?$1=$2 [N,QSA] で、 (2) init rewrite engine with requested uri /function/aaa:1111/bbb:2222/ccc:333 (3) applying pattern '^/function/([^:/]+):([^:/]+)$' to uri '/function/aaa:1111/bbb:2222/ccc:333' (3) applying pattern '^/function/([^:/]+):([^:/]+)(/.+)$' to uri '/function/aaa:1111/bbb:2222/ccc:333' (2) rewrite '/function/aaa:1111/bbb:2222/ccc:333' -> '/function/bbb:2222/ccc:333?aaa=1111' (3) split uri=/function/bbb:2222/ccc:333?aaa=1111 -> uri=/function/bbb:2222/ccc:333, args=aaa=1111 (3) applying pattern '^/function/([^:/]+):([^:/]+)$' to uri '/function/bbb:2222/ccc:333' (3) applying pattern '^/function/([^:/]+):([^:/]+)(/.+)$' to uri '/function/bbb:2222/ccc:333' (2) rewrite '/function/bbb:2222/ccc:333' -> '/function/ccc:333?bbb=2222' (3) split uri=/function/ccc:333?bbb=2222 -> uri=/function/ccc:333, args=bbb=2222&aaa=1111 (3) applying pattern '^/function/([^:/]+):([^:/]+)$' to uri '/function/ccc:333' (2) rewrite '/function/ccc:333' -> '/function?ccc=333' (3) split uri=/function?ccc=333 -> uri=/function, args=ccc=333&bbb=2222&aaa=1111 (2) local path result: /function あってる? >>555 うおおおおおお ありがとうございます! やはり正規表現がだめだったんですね……。 ローカルのXAMPPで試してみたところ、パスの扱いが少し異なるのか、 RewriteRule ^function/([^:/]+):([^:/]+)$ /function.php?$1=$2 [L,QSA] RewriteRule ^function/([^:/]+):([^:/]+)(/.+)$ /function$3?$1=$2 [N,QSA] といったらうまく動きました。 >>547 と似たようなことですが aaa.com/aaa/ にアクセスすると aaa.com/data?id=aaa のページを表示させる方法を教えて下さい >>558 それはわかりますが 普通にrewrite ^/(.*)/$ data?id=$1 とやってもできませんでした 意図通りに動かなかったらまず RewriteLog と RewriteLogLevel ●実現したいこと: ・メンテ時にステータス503を返しつつ、ブラウザに表示されるURLはそのまま ●環境: ・Apache2.2.19、SSL必須 ●問題: ・SSL接続だとURLを maintenance.html に書き換え、ステータス200を返してしまいます。× ・しかし、HTTP接続であれば、URLそのままで503を返すことができます。○ ●httpd.conf: <VirtualHost _default_:443> (省略) ErrorDocument 503 /maintenance.html <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} !=/maintenance.html RewriteRule ^.*$ - [R=503,L] </IfModule> (省略) </VirtualHost> ●rewrite.log: escaping http:// ○○○/maintenance.html for redirect redirect to http:// ○○○/maintenance.html [REDIRECT/302] ●access.log: "GET /maintenance.html HTTP/1.1" 302 221 "-" "GET /maintenance.html HTTP/1.1" 200 477 "-" SSL接続でも503を返しつつ、URLを書き換えない方法はありませんか? 詳しい方よろしくお願いしますm(__)m RewriteLogLevel いくつ? 全く試していないけど RewriteCond %{HTTPS} on もダメ? すみません、↓の設定をコメントアウトしたらできました。 /maintenance.html を返すときにリライトしてたのが原因みたいです。 503以外にも↓の設定の影響がないか、調べる必要が出てきました_no レスありがとうございました。 RewriteCond %{REQUEST_URI} !(^/ssl/.*$) RewriteRule /.*$ http://% {HTTP_HOST}%{REQUEST_URI} [R,L] RewriteRule ^hoge/(a|b|c)\.html$ foo.cgi?hoge=$1 こんな感じのルールを書いたところ、アクセスはできるのですが、 hogeディレクトリを用意しないと、 foo.cgi側で行われるクエリ処理(hoge=$1のところ)が正常に受理されず、 意図した動作にはなりませんでした。 自分のローカル環境のWindowsではそんなことにはならなかったのですが、 サーバのFreeBSD環境にアップロードしたらそのようになりました。 hogeディレクトリは必ず用意しないといけないのでしょうか? /domain1/aaa/. htaccess で、 /domain1/aaa/abc.html にアクセスが来た際、 /domain1/aaa/cache/abc.html が存在した場合に /domain1/aaa/cache/abc.html の内容を返したいのですが、 うまく行きませんでした。現状の書き方です。 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond "/domain1/aaa/cache/%{REQUEST_FILENAME}" -f RewriteRule ^(.+)$ "/domain1/aaa/cache/$1" [L] </IfModule> 正しい書き方を教えて頂けますでしょうか。 >>567 間違ってるかもしれないが、 $1 なのかな? ${REQUEST_FILENAME} じゃないの? >>567 まぁ、ダメだったらとりあえずログ吐いて確認しよう RewriteLog 便利だからテスト中はどんどん使おう。 >>568-570 アドバイスありがとうございます。 さくらのマルチドメイン機能を使っているからか、 シングルドメインで使えそうな記述が機能せず、 模索しているうちに以下のコードで動くようになったので とりあえず張っておきます。ちなみに、なんで 動くかはっきりとした理由は分かりません。(笑) <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /aaa # RewriteLog "/domain1/aaa/rewrite_log" # RewriteLogLevel 2 # >>570 下記によると .htaccess での記入は非対応なのでさくらで使えず断念 # http://net-newbie.com/trans/mod_rewrite.html#RewriteLog # ブラウザが gzip 対応の場合 RewriteCond %{REQUEST_METHOD} !POST RewriteCond %{QUERY_STRING} !.*=.* RewriteCond %{HTTP:Accept-Encoding} gzip RewriteCond "%{DOCUMENT_ROOT}/domain1/aaa/cache/$1.gz" -f RewriteRule ([^/+]+.xml)$ "/aaa/cache/$1.gz" [L] # ブラウザが gzip 非対応の場合 RewriteCond %{REQUEST_METHOD} !POST RewriteCond %{QUERY_STRING} !.*=.* RewriteCond "%{DOCUMENT_ROOT}/domain1/aaa/cache/$1" -f RewriteRule ([^/+]+.xml)$ "/aaa/cache/$1" [L] </IfModule> 以下のような.htaccessを書いたのですがうまく動作しません DirectoryIndex my.cgi RewriteEngine On RewriteCond %{REQUEST_URI} ^(t(est)?)/ RewriteRule !\.(css|js|gif|jpg)$ my.cgi [NC,NE,L] ※URLはディレクトリ以下のパスのみの記載です / => DirectoryIndexに従いmy.cgiにアクセス/画像等はRewriteRuleに従い問題なし /test/test.cgi => RewriteCondに従いtestまたはtディレクトリ以下にアクセス(問題なし) /login/ => File does not exist: ...login(my.cgiにアクセスしない) エラーについては当初正しくmy.cgiが起動されていましたが、 3行目のRewriteCondを追加したらうまくいかなくなりました(コメントアウトすると今でも正常) ですが、どうしてエラーになるのかがわかりません。 ・testまたはtディレクトリにアクセスされたときはリクエストどおり実行 ・画像(等)以外へのリクエストはmy.cgiへ転送 ですので、理屈は通ってるようにも思えるんですが、何がよくないんでしょうか >>572 うむむ…解読不能。 先にやりたい事を書いてから設定内容を張ったほうが分かりやすいと思うよ。 RewriteLogを設定して結果を貼ってみたら? 何度目だこのアドバイス。 RewriteCond %{REQUEST_URI} !my\.cgi$ とか足したらどうなる?w rewrite設定で、 http://www.yahoo.co.jp/test/test1/ を http://www.yahoo.co.jp////test/test1/ でも表示させるようにはどうしたら良いのでしょうか。 はてなにあった RewriteRule (.*)/+(.*) $1/$2 このやりかたでは上手く行かなかったのでして。 >>577 まずyahooのサーバーに侵入します。 >>577 特に設定しなくても、間の/は無視されないか? http://info.2ch.net/guide/adv.html http://info.2ch.net//////guide////////////////adv.html >>572 もう見てないだろうが DirectoryIndex my.cgi RewriteEngine On RewriteCond %{REQUEST_URI} !^/(t(est)?)/ RewriteRule !\.(css|js|gif|jpg)$ my.cgi [L,NC,NE] RewriteCond使わなくても書けるけどな 質問させてください URL http://example.com/hoge/search?key=aaa 上記のURLでtestディレクトリのsearch.phpにアクセスして id=hoge key=aaa を取得したい場合、RewriteRuleはどう書けば良いでしょうか? ちなみに下記のように書いてますがkeyは取得できてidが取得できません。 RewriteRule ^(.*)/search/ test/search.php?id=$1 [L] よろしくお願いします。 >>581 もともと書いてある内容が間違えてるような気がするが RewriteRule ^/([^/]+)/search /test/search.php?id=1 [L,QSA] で var_dump($_GET) した結果が array(2) { ["id"]=> string(4) "hoge" ["key"]=> string(3) "aaa" } ミスった RewriteRule ^/([^/]+)/search /test/search.php?id=$1 [L,QSA] の間違い >>583 おお!ありがとうございます QSAオプションを知りませんでした 助けてください。 http:/directory/abc.jpg?id=123 とブラウザで打ったものを http:/directory/my.php にリダイレクトしたい、ただそれだけなのですが、 パターンマッチに引っかかりません。 パターンマッチの部分はこんな感じです。ついでに他の種類の画像をブラウザで 呼び出したときもマッチして欲しいです。 RewriteRule .*\.(gif|jpg|png)(\w+)$ http:/directory/my.php?id2=%1 もうファイルを200回くらい書き換えました。もうすぐ禿げそうです。 なんとなく自己解決しました。ありがとうございました。 mod_rewriteにより、以下のリライトをしたいです。 http://aaaaa.co.jp/ ⇒ http://bbbbb.co.jp/aaaaa/ Apacheの設定として、httpd.confに以下のような設定を書きました。 # ループ防止 RewriteRule ^/aaaaa/$1 - [L] # リライト RewriteCond %{HTTP_HOST} ^aaaaa\.co\.jp [NC] RewriteRule ^(.+)$ /aaaaa/$1 [L] これでできると思ったのですが、どうしても aaaaa 以下の index.html を読んでくれません。 具体的には、DirectoryIndexとして、 DirectoryIndex index.html index.php という設定をしているのですが、aaaaaディレクトリには index.html が存在しているにもかかわらず、アクセスすると「NotFound:/aaaaa/index.phpがありません」となります。 RewriteLogを出力してログを見てみると、以下のような流れになっているようです。 1.[initial] / でのRewriteルール確認 2.[subreq] index.html でのRewriteルール確認 3.[subreq] index.php でのRewriteルールの確認 4.[initial/redir] /aaaaa/index.php でのRewriteルールの確認【一致】 index.php を用意すると、ちゃんと index.php が表示されるのですが、index.html は表示できず・・・。 どなたか、解決法を教えてください。よろしくお願いいたします。 【条件】 ttp://example.com/user/test/index.cgi にアクセスすると ttp://example.com/user/test/index.cgi/ にリダイレクト ttp://example.com/user/test/index.cgi/ にアクセスすると何もしない 上記のような条件(URLの一番最後に/を入れる)の.htaccessを適用したところ、 今までダイレクトに"ttp://example.com/user/test/index.cgi/"にアクセスしていた 読み込めていた<img>タグが表示されなくなりました。 どのようにすれば<img>も見れてURLの最後に/を入れられるのでしょうか? 設定は下記です。 #.htaccess DirectoryIndex index.cgi Options FollowSymLinks RewriteEngine on RewriteBase /user/test RewriteRule ^(.+[^/])$ $1/ [R,L] #最後に"/"を入れる #html <html> <head><base href="http://example.com/user/test/ "></head> <body><img src="./img/hoge.jpg"></body> </html> #ディレクトリ階層 ~/user/test/index.cgi ~/user/test/img/hoge.jpg RewriteCond %{REQUEST_FILENAME} !(.*jpg$|.*gif$|.*png$) [NC] 人間とウェブの未来 - Apache 2.4.1のmod_luaでApacheに介入する(mod_rewriteの終焉?) http://t.co/lILfEo3S htaccessをいじって 動的アドレスを静的にしたつもりですが 静的アドレスでアクセスできますが そのアドレスリンクをクリックすると ブラウザ上部には 動的アドレスが出てきます。 どうしたらブラウザ上部のアドレスも 静的になりますか? ただのファイルリクエストのように見えるURLをmod_rewriteで query stringを使った動的なCGI呼び出しにリダイレクトするよう にしたらロケーションバーにはリダイレクト後の結果が出ている。 最初のアクセス通りのパスを残しておくことは出来ないか? だと思う。 (1) http://xxx.xxx.jp/index.cgi (2) http://xxx.xxx.jp/index.html (1)が本来のアドレスですが (2)のアドレスにしたいのです。 .htaccessを RewriteEngine on RewriteRule ^index.html$ index.cgi と書いて アドレスバーに(2)を入力すると (1)にアクセスできまして アドレスバーには(2)が表示されたままです。 ブラウザの中のリンクをクリックして (1)にアクセスすると アドレスバーの表記が(1)になります。 この時もアドレスバーに (2)が表示されたいのですが .htaccessの書き方を教えて下さい。 <a href="/index.html" title="バカ"> htaccessをいじって 動的アドレスを性的にしたつもりですが 性的アドレスでアクセスできますが そのアドレスリンクをクリックすると ブラウザ上部には 動的アドレスが出てきます。 どうしたらブラウザ上部のアドレスも 性的になりますか? ~~~~ .htaccess上で、変数のようなものを使うことはできないのでしょうか? $domain = example\.com RewriteCond %{HTTP_HOST} ^www\. $domain RewriteRule〜 RewriteCond %{HTTP_HOST} ^asia\.$domain RewriteRule〜 などと、先頭の一行で多数のCondを一括して変更したいのです。 無茶な質問かもしれませんが、お知恵をお貸しください。 変数的なものは、 SetEnvIf で環境変数(もどき)を定義して RewriteCond で判定に利用できるくらいだろうか。 一部置き換えたルールを大量に定義したいだけなら 生成スクリプト書いて、出来たファイルを Include してくれたまい。 Includeは.htaccessでは使えないw 時代はmod_luaらしいよね。 さくらのレンタルサーバーを使っています。 下記がhtaccessの内容です。置いてるところはwwwフォルダです。 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [QSA,L] </IfModule> 自分のテストサーバーではちゃんと動くんですが、サクラにアップすると動きません。 思い当たるのは、リクエストが*.htmlというファイル名になっている所です。 どういう設定にすれば*.htmlの部分を引数としてスクリプトに渡すようになるんでしょうか? >>602 「動きません」の内容をもう少し詳しく詳しく。 Internal Server Errorが出るのか、404なのか、何か他のエラーが出ているのか・違うエラーならどんな内容か。 >>603 Firefoxだとこのリンクは無効ですとでます。 ChromeだとNo input file specified.とでます。 FirefoxのUrlの文字列が、一瞬長く見えるのでもしかするとUrlが2重になってるのかもしれません。 その辺は一瞬すぎて確認ができませんでした。 エラーログは真っ白だったので、多分転送先のURLが無効なんだと思います。 RewriteRule ^(.*)$ index.php/$1 [QSA,L] を RewriteRule ^(.*)$ index.php?param=$1 [QSA,L] としたら一応リクエストは来たので、最後の/が問題なのかなぁとおもっています。 >>604 php.iniを置いてcgi.fix_pathinfo = 1と1行書いてみたらどうでしょう >>604 もちろん No input file specified. でぐぐって対策くらいはした上で・・・ 質問してるんだよ・・・な・・・え・・・? ・・・何もしていない・・・だと・・・ 質問させていただきます。 トップページのURL http:// ドメイン.sakura.ne.jp/site/index.php をhtaccessに RewriteEngine on RewriteCond %{HTTP_HOST} ^www.ドメイン\.sakura\.ne\.jp RewriteRule ^(.*)$ http:// ドメイン.sakura.ne.jp/site/$1 [R=301,L] RewriteCond %{THE_REQUEST} ^.*/index.php RewriteRule ^(.*)index.php$ http:// ドメイン.sakura.ne.jp/site/$1 [R=301,L] と301リダイレクトを書き、www無しindex.php無しのトップページURL http:// ドメイン.sakura.ne.jp/site/ と統一させてみたのですが http:// ドメイン.sakura.ne.jp/blog/index.php?mode=〜〜〜 というサブページのindex.phpまで消えてしまい http:// 〇〇〇.sakura.ne.jp/blog/?mode=〜〜〜 というURLになり、ページがうまく表示されなくなってしまいました。 トップページのindex.phpだけを消し、サブページのindex.phpは残す方法はありますでしょうか? link rel="canonical"で設定する方法以外でお願いいたします。 よろしくお願いします。 表記ミスしました。 サブページ http:// ドメイン.sakura.ne.jp/blog/index.php?mode=〜〜〜 ↑は間違えで http:// ドメイン.sakura.ne.jp/site/index.php?mode=〜〜〜 です。トップページとサブページのindex.phpまでのURLは同じです。 失礼しました。よろしくお願いします。 mod_rewriteの設定をhttpd.confに書いた場合は効くんですが.htaccessに書いた場合に効きません ,htaccessの他の設定は効いています httpd.confには下記のように記述してます <Directory /> Options FollowSymLinks AllowOverride All </Directory> 他にチェックするところは何がありますか? 何はともあれログ出力を指示して、効いてないのか、 効いてるけど意図通りになってないのかを判別するのが先だと思う。 Contextは…っと、RewriteRuleは.htaccessに書けるな。 RewriteEngine On はバーチャルホストごとに独立らしいけど、 .htaccessにも書く必要あるんだっけ? 質問です、 RedirectMatchで以下のように設定したいのですが、上手く動いてくれません。 http://***.com/AAA/ ↓ http://***.com/seach.php?q=AAA .htaccessを作成して、以下を記載しています RedirectMatch ^/(.*)/?$ /search.php?$1 [NE] 上記の結果、 リダイレクト後に以下のようになってしまい、?をエンコードさせないようにhtaccessだけで設定したいと考えてます。 http://***.com/search.php%3fAAA さくらのレンタルサーバでやりたいと思ってます、何か方法をご存じの方いませんでしょうか? Redirect系は?以下を対象にしなかったような。 >>613 エスケープもしたのですが、直接変換されてしまうようです。 http://***.com/search.php \%3fAAA \はブラウザによって解釈されて、 http://***.com/search.php%5c%3fAAA などになります(IE) RedirectでもRewriteでもどちらかできればよいのですが、上手くいかないです。。 だからRedirect系は?以下が対象にならないんだって。 で、RewriteはCondでQUERY_STRINGに()を使って拾って Ruleで%1などを使って展開させる。 >>616 ご教授頂いた内容は逆のパターンではないでしょうか? http://muumoo.jp/news/2006/04/06/0redirect.html 今回やりたいのはこれなんですが、 http://***.com/AAA/ ↓ http://***.com/seach.php?q=AAA "AAA"は拾えてるのですが、RewriteRuleの変換時に?がエスケープをしてもエンコードされてしまうのに困っています。 さくらのレンタルサーバで、htaccessへの記述でなんとかできないか困ってます。(自鯖でapache立てれば一瞬なのは分かってますが、、、) 試してない。 [N] を使って、書き換え後にもう一度リライト処理を通すときも エスケープされるんだろうか。 RewriteCond %{REQUEST_URI} !^/search¥.php RewriteRule ^/([^/]+)/$ /search.php?q=$1 [N] RewriteRule ^(.+)$ ?$1 [L] をしてるのですが、%xxが勝手にデコードされるのを止める方法はないでしょうか? 記号と記号をエンコードしたものを区別して取得したいのです。 ブラウザ等ではデコードした状態で見せたいので、2重にエンコードするのはなしで Windows版Apache+mod_rewriteで、URLに「:」が使えない問題 ってまだ解決法ないのかね? どのRFCですか? たくさんあるので、読んだものもあれば 読んでないものもあるので、 答えられれません。 >>621 がRFC読めって落ちだろうな ワクワクw >>622 読んでないものばかりですね わかります >>620 ttp://www.ietf.org/rfc/rfc1630.txt これを読んでもわからない? 読んだことなかった? > Windows版Apache+mod_rewriteで(ry 本当に":"が使えなかったらschemeの後は何で区切ろうかな 使えるところ使えないところがわからないアホってすごいな http://sub.example.com/file.txt http://example.com/sub/file.txt 実際のファイルは下のURLにある状態ですが、 上のURLにアクセスした場合にも同じファイルを返したいと思っています。 実際は下のファイルは階層が深く、URLがかなり長いので、ショートカットのような形で使いたいと思っています。 その時に、上のURLでアクセスした場合は上のURLのままにしておきたいのですが、どのようにしたら実現できるでしょうか。 現在 sub.example.com の .htaccess に以下のような記述をしてみたのですが、URLが下のものに変わってしまうようです。 RewriteEngine On RewriteBase / RewriteRule ^(.+)$ http://example.com/sub/$1 [L] mod_rewriteよか、したのサーバーでリバースプロキシだろ RewriteRule ^(.+)$ http://example.com/sub/$1 [L] にPフラグを付けたして、 RewriteRule ^(.+)$ http://example.com/sub/$1 [L,P] とすることで希望の動作になりました。 さくらのレンタルサーバーを使っているのですが RewriteRule (.+)/([0-9]+)$ $1.php?id=$2 [L] や RewriteRule a/([0-9]+)$ a.php?id=$1 [L] などの用に書き換え先と書き換え後に同じ文字があると404エラーになってしまいます。 RewriteRule a/([0-9]+)$ b.php?id=$1 [L] なら動くのですが・・・。 どうすれば同じ文字を使い書き換えすることができるんでしょうか・・・? 御存知の方教えてください。 mod_rewriteで呼び出すnph-cgiのボディに余計なヘッダ文字列が出力されます。 ヘッダには意図した文字列が出力されます。 まさにこのスレの>>76 >>286 と同じ症状なんですが回避策ありませんでしょうか? そろそろmod_rewriteも終わるか? Apacheのmod_rewriteをmod_mrubyによって無くす事ができるか http://blog.matsumoto-r.jp/?p=2969 質問させてください 現在Apacheのバーチャルホスト機能を利用しています ■VirtualHostの設定はこのようになっています(DocumentRootは同じ) <VirtualHost *:80> ServerName www.example.com DocumentRoot /home/hoge/public_html </VirtualHost> <VirtualHost *:80> ServerName www.example2.com DocumentRoot /home/hoge/public_html </VirtualHost> ■やりたいこと 1) http://www.example.com/hoge/ でアクセスがあった場合 /home/hoge/public_html/index.php?id=hogeを表示したい。 RewriteRule ^([a-z0-9_-]+)/$ /home/hoge/public_html/index.php?id=$1 [L] 2) http://www.example2.com でアクセスがあった場合 /home/hoge/public_html/index.php?id=hogeを表示したい。 RewriteRule ^$ /home/hoge/public_html/index.php?id=hoge [L] つまり、異なるドメインで同じページを表示したいのです。 このRewriteRuleを両方書いても最初に書いたルールしか適用されません。 オプションが問題なのでしょうか?よろしくお願いします。 >>637 はい。レスありがとうございます。 設定は全部でこのようになっています。 RewriteEngine on # 1) www.example.com用 RewriteRule ^([a-z0-9_-]+)/$ /home/hoge/public_html/index.php?id=$1 [L] RewriteRule ^([a-z0-9_-]+)/([a-z]+)/$ /home/hoge/public_html/$2.php?id=$1 [L] # 2) www.example2.com用 RewriteRule ^$ /home/hoge/public_html/index.php?id=hoge [L] RewriteRule ^([a-z]+)/$ /home/hoge/public_html/$1.php?id=hoge [L] 1)は、http://www.example.com/hoge/ でアクセスが会った場合、id=hogeになるようにしています。これを 2)で、http://www.example2.com でアクセスがあった場合、id=hogeになるような設定にしたいと思っています。 id=hogeは当然設定に記入する必要がありますよね。そしてアクセスがあった場合両方のドメインで同じようになるようにしたいのです。 よろしくお願いします。 丁寧な質問者に対してこんなこと言うのはほんと心苦しいんだけど、頼むから全部貼って http://localhost/ ~example/test.phpに<a href="/">top</a>を書いて このリンクを踏むとhttp://localhost/ に飛んでしまいます href="/"というリンクが使いたいので、ドキュメントルートをhttp://localhost/ ~example/にする方法を教えてください >>642 baseでggrks mod_rewrite関係ねえから ちょっと質問させてください apache2.2から2.4への移行作業をしていて気づいたのですが 2.2のときはトップページへのアクセスを RewriteRule ^$ /foo.php としてリライトしてたのですが 2.4ではこの条件に該当しなくなってしまいました。 いろいろ試行錯誤したところ RewriteRule ^(index\.html)?$ /foo.php と書くとOKということが分かりました。 RewriteRule ^index\.html$ /foo.php はNGでした。 回避策は分かったのですがなんだか気持ち悪いので質問してみました。 これは仕様が変わったのでしょうか? おしえてください。 URLそのままで、外部のサイトを表示させたいです。 http://www.hogehoge.com/pages/test01/ を、 URL欄をそのままに http://aaaa.hogehoge.com/pages/test01/ を表示させたいです wwwの .htaccess に RewriteRule ^pages/(.*)/$ http://aaaa.hogehoge.com/pages/$1/ [R,L] って書くと、URLまで変わっちゃいます。 お願いします mod_proxyが、無いとダメっぽいですね。 サーバーには、入ってませんでした (つд⊂)エーン Rが付くとデフォルトでは301を使ってリダイレクトする。 メインのwww.〜のサーバーが仕様が古くて、使いたいプログラムが動かないだわ。 パクリサイトの手口もそうやるんだろうけどさ。 さくらサーバーリダイレクト301で 初期ドメイン から 独自ドメインに転送したいのでうまくいきません RewriteEngine on RewriteCond %{HTTP_HOST} ****?.sakura?.ne?.jp [NC] RewriteRule .* http://www.*******.jp% {REQUEST_URI} [L,R=301] Internal Server Errorが出てしまい さくらのエラーログを見ると /home/アカウント/www/.htaccess: Invalid command '\xef\xbb\xbfDirectoryIndex', perhaps mis-spelled or defined by a module not included in the server configuration ログにあるようにwww配下に.htaccessを置いています 訳すとスペルミスかモジュールがないと言う事ですが さくらサーバーは公式でmod_rewriteを利用できるみたいですし 記述が間違っていうのでしょうか どうかよろしくお願いいたします。 DirectoryIndexの手前に全角スペースとか付いてね? >>651 >\xef\xbb\xbf とりあえず、UTF-8のBOMだな、これ。 付かないように保存してみたら? Apache の .htaccess の設定について質問させてください。 特定のファイルへアクセスがあった場合には、そのファイルだけリダイレクトをかけたいです。 具体的には、 contact.html にアクセスが来た場合には、 contact.php ファイルに飛ばしたいと考えています。 どういうコードを書けば全ファイルでは無く、特定のファイルに対して.modrewriteを使えますか? 普通に RewriteRule (.*)/contact.html$ $1/contact.php [R=301,L] とかそんなんでいいんじゃないの >>656 ありがとうございます! このスレが過疎過ぎて誰も見てくれていないんじゃないかと思ってましたw 質問スレでもない特定のモノ向けのスレだからな、過疎るのはしょうがない 何か特別話題があるわけでもないし とはいえ見てる人は見てるだろう、俺も専ブラのブックマークしてチェックはしてるし 一見過疎ってても案外すぐレスが付くところは珍しくは無い リライトそのものはオワコン化しつつあるし、 >>655 程度ならRedirectMatchで十分だろと思いつつ にやにやしながら読んでるしw >>659 そんな方法もあったのね。 オワコンってまじでっか? 質問させて下さい。 http://sample.co.jp/xxx/ にアクセスしたときに http://sample.co.jp/xxx.php を表示したくて、.htaccessに RewriteEngine on RewriteOptions MaxRedirects=1 RewriteBase / RewriteCond %{REQUEST_FILENAME}\.php -f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9a-zA-Z_\-]+)/$ $1\.php [L,R] と書いたのですが、正常に動作してくれません。 どこが間違っているか教えて下さい。 マッチしてるか調べたい文字列が base64でエンコードされているのですが これをデコードしてからマッチさせるところまで 全部正規表現で記述出来ますか? 933 名前:デフォルトの名無しさん[sage] 投稿日:2014/10/21(火) 13:15:50.92 ID:QuOrKhyR マッチしてるか調べたい文字列が base64でエンコードされているのですが これをデコードしてからマッチさせるところまで 全部正規表現で記述出来ますか? .htaccessに書いた内容が思ったように動かないとき、 動作を確認する方法はあるのでしょうか? >>665 ハゲはお前だろ。 ていうか、ありがとうございます。 ログってApacheのログですか? 665だけど1万本くらいてめえにくれてやりたいくらい多すぎて鬱陶しいレベルでふさふさだぞ りらいとろぐでggrks >>668 1万本もないくせによく言うわツルッパゲのカス野郎。 っていうか、ありがとうございます。 リライトログでぐぐってみます。 rewritelog って RewriteCond でスキップされるケースでも 全部ログに残ってしまうみたいだけど スキップしたときのログを残さないのは無理? Level 1 だとスキップしたものも記録される Level 0 だと全部消える 誘導されて来ました。 リクエストヘッダで 'Cookie' => 'PHPSESSID=fadkcau6mnmq1ul6jo5pvngqlahd2hoge', と送られてくるべきものが、ブラウザのバグで 'Cookie' => ', PHPSESSID=fadkcau6mnmq1ul6jo5pvngqlahd2hoge', と送られてきてるんだけど、これ apache 側でphpに食わすまえに置換できないかな。 mod_headers の RequestHeader は置換できないみたいだし、いい方法ある? そのまま放置してバグったブラウザをいつまでも使ってんじゃねーよとするw こんにちは。スレ誘導されて来ました。 www統一についてはGoogleで沢山引っかかるのですが、 下記の問題については全然出てこないので、質問させて頂きます。 ----- www・index無しを.htaccessでリダイレクトして統一したいと思い、 以下を.htaccessに書き加えました。正常に動作しましたが、以下のように なってしまい困っています。ファイルの拡張子が書き加えられてしまいます。 http:// ○○○.jp/××× ↓(にwwwを書き加えて飛ぶと) http:// ○○○.jp/×××.html できれば上記のように拡張子を書いていない場合はwwwを付け加えても ファイルの拡張子なしでの表示をしたいのですが、それは可能でしょうか? 使っているサーバーはさくらのスタンダードプラン・ファイルの属性は604です。 是非、知恵をお借りしたいです。よろしくお願い致します。 ----- RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.○○○\.jp$ RewriteRule ^(.*)$ http:// ○○○.jp/$1 [R=301,L] RewriteCond %{THE_REQUEST} ^.*/index\.html RewriteRule ^(.*)index.html$ http:// ○○○.jp/$1 [R=301,L] >>676 です。すいませんがageさせて頂きます。 Order allow,deny Allow from all Deny from 5.9 Deny from 8.35.201 SetEnvIfNoCase Referer a.com spammer=yes SetEnvIfNoCase Referer b.com spammer=yes SetEnvIfNoCase Referer c.com spammer=yes Deny from env=spammer SetEnvIfNoCase User-Agent "aaa" BlockRobots SetEnvIfNoCase User-Agent "bbb" BlockRobots Deny from env=BlockRobots ↑これと同等のことをapache2.4でまとめて書くにはどうしたらいいですか? >>676 です。 他の方に聞いて解決したので、やり方書いておきます。失礼しました。 拡張子が表示されるのはさくらの仕様だそうで、下記の例で 拡張子が.htmlと.txtの場合は拡張子をつけない形でリダイレクトする事ができるそうです。 RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.○○○\.jp$ RewriteRule ^(.*)(\.html|\.txt)$ http:// ○○○.jp/$1 [R=301,L] RewriteCond %{HTTP_HOST} ^www\.○○○\.jp$ RewriteRule ^(.*)$ http:// ○○○.jp/$1 [R=301,L] 誰でも簡単にネットで稼げる方法など 参考までに、 ⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。 グーグル検索⇒『半藤のブブイウイウレレ』 GX18ZIQQPT ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の 両院で、改憲議員が3分の2を超えております。 『憲法改正国民投票法』、でググってみてください。国会の発議は すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ wordpressのリダイレクト設定をしていますが、 だれかお答えできるかたいらっしゃいますか? --- 存在しないページは、全てトップページに遷移していますが、 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /2020renewal/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d </IfModule> 次のURLのみ、遷移せず404表示させたいのです。 https://example.jp/2020renewal/example_test/ どのように表記すればよろしいでしょうか? htaccessの質問はここでよいですかね。 以下のようなhtaccssの設定を教えてください。 @次のURLにアクセスしたらhtdocsを省略したURLがブラウザで表示されるようにしたい。 ただし、実際にアクセスするファイルは元のまま。 example.com/yokohama/0010/htdocs/xxxxx.php ↓ブラウザ表示 example.com/yokohama/0010/xxxxx.php A次のURLにアクセスしたら、htdocsを含むURLにリダイレクトをかけたい。 ただし、ブラウザの表示はhtdocsが抜かれた状態のまま。 example.com/yokohama/0010/xxxxx.php ↓リダイレクト example.com/yokohama/0010/htdocs/xxxxx.php ↓ブラウザURL表示 example.com/yokohama/0010/xxxxx.php 0010 ├───htdocs │ ├───xxxx.php │ ├───try57.php │ └───index.html └───wp └───wp-admin └───about.php 要するに、htdocsというディレクトリの存在をURLに見せたくないのです。 どうぞアドバイスいただけたらと思います。 read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる