• ベストアンサー

特定のリファラーのみリダイレクトでURLを指定したい(.htaccessの書き方)

自分の管理外のWebサイトA,B,Cから"example.com"のトップページへ リンクされています。リンク元のURLは変更できないので、A,B,Cの 特定のページからのリファラーのみ"1.html"へリダイレクト(301) したいと思っています。※URLは全てダミーです リンク元 http://site-a.jp/a.html http://site-b.jp/b.html http://site-c.jp/c.html 現在のリンク先 http://example.com/index.html 移転先 http://example.com/1.html 【私が書いた.htaccessの内容】 SetEnvIf Referer "^http://site-a\.jp/a\.html" ref_a Redirect permanent /index.html http://example.com/1.html env=ref_a これではエラー500が返ってしまいだめでした。移転前と移転先は 同じなので、できればA,B,Cをまとめてセットして、リダイレクト の行は1つにしたいと思っています。無理なら1つずつ書きます。 よろしくお願い申し上げます。

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

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

No.5さん フォローありがとうございました。(成功したようで安心しました。) No.5さんの場合、元々のリクエスト「http://example.com/」の場合に限定されていましたので、RewriteRuleの直後が「^$」となりました。 質問者様の場合は、元々のリクエストが「http://example.com/index.html」となっていますので、「index\.html」も付けた方がよさそうです。 また、3つのURLも以下のような指定で行けるかもしれません。 ------------------ RewriteEngine on RewriteCond %{HTTP_REFERER} site-(a¥.jp/a|b¥.jp/b|c¥.jp/c)\.html [NC] RewriteRule ^(index\.html)?$ /example.com/1.html [R,L] ----------------- 私も勉強になりました、有難う御座います。 それでは頑張ってください。

chie0918
質問者

お礼

ご返信ありがとうございました。遅くなってすみません。 お書きいただいた通りで、特定のリファラーだけのリダイレクトができました! 会社の人が何も考えずにサイトを移転してしまったので、リンク間違いがたくさんできてしまい困っていたのです。(後になって、リンク元にURL変えてくださいって言いにくいですし) いろいろと調べていただいたようで、ありがとうございました。 さっそく今から特定のURLだけリダイレクトかけます。 ありがとうございました!!

その他の回答 (5)

回答No.5

1さんの書かれた困っていた人です。 私は下記の内容で行けました。 --- RewriteEngine on RewriteCond %{HTTP_REFERER} site-a¥.jp/a\.html [NC] RewriteRule ^$ /example.com/1.html [R,L] --- ポイントは3行目" ^$"で、"/"や"index.html"を指定しません。 複数の場合は連続して書けば良いのかも知れません。 私の環境は、さくらサーバーのライトプランです。 > Apache/1.3.41 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e 詳しく無いためこれ以上は解りません。 ここに書くためだけに登録したのでポイントなどは不要です。

回答No.4

同じ問題に詰まっているこちらの人にも色々やってもらいましたが、駄目みたいですね。 逆にお手数掛けてしまい申し訳ありません。 で、検索したところ、↓のURLに解決方法が書いてありました。 http://www.ksknet.net/apache/rewritecond_rew.html RewriteCondで条件を書いて、RewriteRuleでリダイレクトを指定できるようです。

参考URL:
http://www.ksknet.net/apache/rewritecond_rew.html
回答No.3

そうですか。失礼致しました。 ちなみに、今リファレンス確認したら  > Header set Status: ・・・  > Header set Location: ・・・ の途中の":"(コロン)は不要でしたが、これは関係無いですか?

回答No.2

No.1、追記と修正です。 結局のところ、"環境変数を指定できるディレクティブは限られている"と書いてありましたので、環境変数の指定が出来る「Header」を使えば動くのでは?という事です。 先ほどはURLの絞り込みを付け忘れてました。 三つのサイトを同時にという場合でも、条件部分だけ追加すれば出来そうな気がします。 SetEnvIfNoCase Referer "^http://(site-a\.jp/a|site-b\.jp/b|site-c\.jp/c)\.html" ConditionMatched <FilesMatch "/index.html"> Header set Status: "301 Moved Permanently" env=ConditionMatched Header set Location: "http://example.com/1.html" env=ConditionMatched </FilesMatch> ※何のテストもしていないコードですので、参考までにお願い致します。 ※実は、ちょうど同じタイミングで同じ問題に詰まっている人から質問されたもので、ついでにと言っては失礼ですが、検索で見つかったここへ回答致しました。

chie0918
質問者

補足

ん~、だめみたいです。500が返ってきました・・・

回答No.1

こういう感じでは利きませんか? すみません。下記URLのリファレンス見ながら書いてみただけです。.htaccessとか使った事が無いので間違えていたら無視して下さい。 SetEnvIfNoCase Referer "^?http://site-a?\.jp/a\.html" ConditionMatched Header set Status: "301 Moved Permanently" env=ConditionMatched Header set Location: "/hoge" env=ConditionMatched 参照したURL http://httpd.apache.org/docs/2.2/ja/mod/mod_setenvif.html#setenvifnocase http://httpd.apache.org/docs/2.2/ja/mod/mod_headers.html#header

参考URL:
http://httpd.apache.org/docs/2.2/ja/mod/mod_headers.html#header

関連するQ&A

  • 動的URLから静的URLへのリダイレクト

    htaccessで動的URLを静的URLに301リダイレクトしたいのですが、うまくいきません。 どのように記述すればよいでしょうか? 静的URL同士のリダイレクトしか分からず、困っています。 よろしくお願いします。 http://example.com/yyy.cgi?cate=1&page=1 リダイレクト先 http://example.com/zzz.htm

  • .htaccessで動的URLを静的化

    動的URLを静的化したいと考えています。 ネットで調べるとよくあるサンプルは RewriteRule ^/dir/([0-9A-Za-z]+)/([0-9A-Za-z]+)$ /dir/index.php?a=$1&b=$2 という風に「静的なURLにアクセスして、内部ではパラメータ付きのURLでの処理をさせる」 というパターンが多いのですが、私がやりたいのは逆で「動的URLにアクセスがあれば静的URLにリダイレクトをさせる」というものです。 理由は、 ・すでにサイトがある程度できあがっていて、既存のURLもある程度Googleにインデックスされている ・パラメータの組み合わせパターンが色々あるため上記のようなルールで対応できない などです。 そこで http://xxx.com/dir/index.php?a=01&b=02 や http://xxx.com/dir/index.php?b=02&c=03&x=999 といった動的URLを http://xxx.com/dir/a-01/b-02/ http://xxx.com/dir/b-02/c-03/x-999/ RewriteRuleを使ってこのような形で一旦301リダイレクトさせ、これをPHPの内部処理でパラメータ付きURLに戻すことによって既存のロジックを生かしたままURLを静的化できないかと考えています。 RewriteRuleの記述を色々書き換えて試してみたのですが、どうしてもやりたいようなURLの変換ができません。 どのように記述すればよいか、ご教授下さい。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • .htaccessのリダイレクトについて

    .htaccessで以下のようにURLをリダイレクトさせたいのですが、調べてもなかなかこのようなサンプルがなく、悩んでいます。 以下のようなURLにアクセスした場合 example.com/public example.com/public/ example.com/public/pageA example.com/public/pageB example.com/public/pageB/pageC 以下のように、publicを削除したURLにリダイレクトしたいです。 example.com example.com/ example.com/pageA example.com/pageB example.com/pageB/pageC 上記の設定は.htaccessのRewriteRuleの設定で可能でしょうか? どなたか詳しい方がいたら教えていただきたいです。 よろしくお願いします。

    • ベストアンサー
    • HTML
  • htaccessでのクエリ付URLのリダイレクト

    .htaccessにて、Perlで作成されたスクリプトのURLを以下のようにmod_rewriteで変換を行っています。 RewriteEngine on RewriteBase /cgi/ RewriteRule ^([0-z]+)/([0-z]+)\.html$ index.cgi?mode=$1&no=$2 通常の場合、 http://example.com/cgi/index.cgi?mode=pv&no=1 といったURLが、mod_rewriteにて http://example.com/cgi/pv/1.html というURL形式でアクセスが可能です。 そこでやりたい事なのですが、上記のpvの箇所をpastという風に変更したいと思っています。 http://example.com/cgi/pv/1.html http://example.com/cgi/past/1.html スクリプト側の問題かも知れませんが、過去ログに移行したデータなどはpastになるのですが、何故かpv(現行ログ)でもアクセス出来てしまいまして、出来れば.htaccessでpastに統一したいと思っています。 そこで単純ながら、Redirect permanentを使い、 Redirect permanent /cgi/view/ http://example.com/cgi/past/ としたところ、リダイレクトはされるのですが、 http://example.com/cgi/past/1.html?mode=view&no=1 となってしまいます。 語尾のクエリ部分「?mode=view&no=1」が出ないようにしたいのですが、どのような方法があるか、ご教示頂けますと幸いです。 RewriteCond %{QUERY_STRING}なども調べて見たのですが、詳しくどう記述すれば良いかわかりませんでした。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • .htaccessを使ったリダイレクト

    FC2のレンタルスペースでサイト運営をしている者です。 特定のサイトからのアクセスを、指定したページへリダイレクトすることになりました。 そこで急ぎのため、よく知らない.htaccessを見よう見まねで書いたのですが、うまく動作しません。 特定のサイト.comから、http://私のサイト.web.fc2.com/へリンクを貼られています。 ↓このように書きました。間違っているところを直していただけませんか? RewriteEngine on RewriteCond %{HTTP_REFERER} ^特定のサイト.com$ RewriteRule ^$ http://私のサイト.web.fc2.com/指定したページ.html

  • リダイレクトURLのなぞ

    先ほど以下の質問をしたものです。 URLでのリダイレクト? http://okweb.jp/kotaeru.php3?q=1213110 http://rd.yahoo.co.jp/shopping/ymain_cbox/left/?http://shopping.yahoo.co.jp/food_and_drink/ というような二つのURLに?を挟んだURLは何をやっているのかという質問でした。 無事回答を頂き、apacheかCGIが?以降のURLへ転送しているのだと理解できました。 そこで思い出したのですが、確か2chでも似たようなものがあったように思います。2chの場合は、リファラーによってどこのスレッドから飛んできたのかということが特定されると不都合なので、間にリダイレクト専用のページ?のようなものを挟むことで、どこのスレッドにリンクが張られようが、そのリンクへのアクセスはすべて一度そのリダイレクト専用ページに飛ばされ、そこから再度目的のページへ飛ぶような仕組みになっているから、リファラーが特定されないというような話を見たことがあります。 しかしYahooにはそんな理由はあてはまらないと思います。リファラーを偽装するのが目的でないとしたら、Yahooは一体なんのために、こんなリダイレクトの仕組みを設けているのでしょうか? カテゴリがここであっているか分からないのですが、情報がありましたらお教えください。 よろしくお願いします。

    • ベストアンサー
    • HTML
  • .htaccessのリダイレクトの書き方

    .htaccessのリダイレクト処理で http://sample.com/index.phpにpost情報込みでアクセスがあった場合、 「www統一」 「index.phpなし」 「index.phpなしアドレスにリダイレクトされた場合もpostの値を取得できる」 という条件を満たすコードはどのようにすれば良いのでしょうか? 「www統一」や「index.phpなし」は説明サイトも多いので可能なのですが、リダイレクト後のURLでもpostの情報を取得する方法がわかりません。 どうそよろしくお願いします。

    • ベストアンサー
    • HTML
  • リダイレクトできません。クエリー文字列を含めたURLはリダイレクトしない?

    .htaccessで http://example.com/index.php?%E3%83%8B%E3%82%B3%E3%83%8B%E3%82%B3%E5%8B%95%E7%94%BBwiki ↓ http://example.com/ にリダイレクトさせようと思っています。 以下をを実行してもうまくいきません。 Redirect permanent /index.php?%E3%83%8B%E3%82%B3%E3%83%8B%E3%82%B3%E5%8B%95%E7%94%BBwiki http://example.com/ 以下の様にするといくのですが Redirect permanent /index.php http://example.com/test.php 上と下の違いはクエリー文字列が含まれていることだとおもいます。 クエリー文字列を含めるとリダイレクトは働かないのでしょうか? 文字列をなんらか形でエスケープする必要があるのでしょうか? javascriptだといくのですが、.htaccessだといきません。 教えてください。宜しくお願いします。

  • .htaccessでリダイレクト先を指定したい

    初めまして、ご質問させていただきます。 現在新しいホームページを作っていて、 サイトにアクセスしたIPアドレスで表示先を切り替えたいのですが .htaccessのリダイレクト指定で可能なのでしょうか? 例えばhttp://www.hogehoge.com/にアクセスした場合 ↓ 【アクセスが自分以外のPCの場合】 http://www.hogehoge.com/index.html 【アクセスが自分のPCの場合】 http://www.hogehoge.com/index.php ネットで調べていて.htaccessという存在を知り、 色々と調べてみて、分からなかったので質問させていただきました。 参考箇所↓ http://www.shtml.jp/htaccess/redirect.html よろしくお願いいたします。

  • headでファイル情報を取得する場合のRefererは?

    ($type, $length, $time, $expires, $server) = head "http://www.example.jp/test.txt"; このような形でhead情報を取得する場合にRefererは送信されていないのでしょうか? example.comからexample.jpのtxtファイルを読みに行く際に、example.jp側のhtaccessでRefererによるアクセス制限をかけるとexample.comをokにしていても蹴られてしまいます。 SetEnvIf Referer "^$" ref_okにすると読めるのでheadでの情報の取得の際にはRefererが送信されていないのではないかと考えています。 ただこれだとURL直接入力でtxtが表示できるのでセキュリティの意味はありません・・・ CGIプログラムが情報を取得する際(headでもconnectでも)先にRefererの送信ができれば可能な気がしますが、そんなことができるのかわかりません。 CGIでRefererの送信方法もしくは特定のURLのCGIからのみアクセスを許可するなどのアクセス制限方法などありませんか?

    • ベストアンサー
    • Perl