.htaccessとRewriteRuleの質問です。RewriteRuleの書き方がわからず困っています。

検索エンジン対策のため、サイト全体のURLを「wwwあり」に統一しています。
共有SSLを使って、httpsで別ドメインへアクセスさせたいのですが、うまく行きません。

以下のページを参考にしたのですが、httpsのページがループしてしまいます。
どのようにRewriteRuleを書けばよいか解決できるでしょうか?お知恵をお借りできれば幸いです。

▼参考URL
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1988&forum=2
http://www.asnext.com/web_tech/htaccess/

※詳細はコメント欄に記載します。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/04/22 10:42:53
  • 終了:2010/04/29 10:45:06

回答(2件)

id:Bombastus No.1

ホーエンハイム回答回数409ベストアンサー獲得回数522010/04/22 12:23:20

ポイント35pt

httpsでアクセスされた場合には共有SSLへ飛ばせば良いという条件でしょうか?

でしたら、下記のような感じになります。

---------------------------------------------

RewriteEngine on

RewriteCond %{HTTP_HOST} ^example\.com [OR]

RewriteCond %{HTTP_HOST} ^www\.example\.com

RewriteRule ^/(.*)$ http://www.example.com/shop/$1 [R=301,L]

RewriteCond %{HTTPS} on [OR]

RewriteCond %{HTTP_HOST} ^example\.com [OR]

RewriteCond %{HTTP_HOST} ^www\.example\.com

RewriteRule ^(.*)$ https://secureXXX.sakura.ne.jp/example.com/test/$1 [R=301,L]

id:icta

Bombastusさん、ご回答ありがとうございます。

すみません!

▼コメント欄の記載を間違えていました。/testではなく/shopです。

誤)RewriteRule ^(.*) https://secureXXX.sakura.ne.jp/example.com/test/$1 [R]

正)RewriteRule ^(.*) https://secureXXX.sakura.ne.jp/example.com/shop/$1 [R]

せっかくご回答いただいたのに前提が間違っていてご迷惑をおかけしました。

httpsがすべて別のディレクトリにあれば簡単だったのだと思いますが、同じディレクトリ内の▼以下の場合のみhttpsにしたいのです。

○共有SSLで使用されるURL:

https://secureXXX.sakura.ne.jp/example.com/shop/SSL1(.*)

https://secureXXX.sakura.ne.jp/example.com/shop/SSL2(.*)

https://secureXXX.sakura.ne.jp/example.com/shop/form(.*)

これ以外は通常通りwwwありのURLにしたいのです。

http://www.example.com/shop/(.*)

お手数をおかけして申し訳ありませんが、再度お知恵をお借りできればうれしいです。

よろしくお願いいたします。

2010/04/22 12:52:32
id:rouge_2008 No.2

rouge_2008回答回数594ベストアンサー獲得回数3512010/04/24 00:28:30

ポイント35pt

.htaccessは「example.com」のルートに設置してください。

※「http://example.com/」と「http://www.example.com/」は同じディレクトリですよね?

RewriteEngine on
RewriteBase /

# 共有SSLの場合は別ドメインへアクセス
RewriteRule ^shop/((?:SSL1|SSL2|form).*)$ https://secureXXX.sakura.ne.jp/example.com/shop/$1 [R,L]

# HOMEを/shop/に(※shopディレクトリにリダイレクト)
RewriteCond %{HTTP_HOST} ^www.example.com
RewriteCond $1 !^(shop)
RewriteRule ^(.*)$ /shop/$1 [R=301,L]

#wwwなしをwwwありに変更しつつ、shopディレクトリにリダイレクト
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule ^(.*)$ http://www.example.com/shop/$1 [R=301,L]

※上記の例では、「RewriteCond $1 !^(shop)」で「shop」ディレクトリを除外していますが、ディレクトリを除外したい場合は、他にも以下のような書き方が出来ます。

RewriteCond %{REQUEST_URI} !/?shop/?

※除外したいディレクトリ「shop」に、さらに「RewriteEngine Off」と記述した「.htaccess」を設置しても可能なのですが、上記どちらかの条件指定で除外した方がいいと思います。

http://matsui.hamazo.tv/e1710565.html

http://www.tp-hp.com/memo/tag/htaccess/

id:icta

rouge_2008さん、ご回答ありがとうございます。

早速試してみましたが、エラー500で「Internal Server Error」が表示されます。

?:SSL1の「?: 」を取り除くと「Internal Server Error」は表示されなくなりますが、Firefoxでhttpsのページに限り「ページの自動転送設定が正しくありません。このアドレスへのリクエストに対するサーバの自動転送設定がループしています。」と表示されます。

SSL1、SSL2、formはディレクトリではなく、SSL1.cgi(+パラメータ)、SSL2.cgi(+パラメータ)、form.htmlのため、このようにループしてしまうのでしょうか?

またjavascript、CSS、画像などを保管しているhttp://www.example.com/js/http://www.example.com/css/http://www.example.com/img/などを読むことができなくなってしまいました。

http://example.com」でアクセスされた場合だけ、「http://example.com/shop/」に飛ばすようにし、それ以外のURLはディレクトリの位置を変えることなく、wwwなしの場合にのみ、wwwありにしたいと考えています。

>「http://example.com/」と「http://www.example.com/」は同じディレクトリですよね?

はい、同じディレクトリです。

今回のご回答で初めてディレクトリを除外する方法を知り、これを使えば何とか実現できそうな気がします。

お手すきのときにご確認いただければ幸いです。

2010/04/24 09:41:29
  • id:icta
    サーバーはsakuraを使用しています。sakuraは共有サーバーをhttps://secureXXX.sakura.ne.jp/ドメイン名/でアクセスします。

    ■「wwwあり」に統一
    http://www.example.com/とhttp://example.com/のどちらにアクセスしても、http: //www.example.com/shop/を表示させる。
    ■共有SSLの場合は別ドメインへアクセス
    ○ドメイン名:example.com
    ○共有SSLで使用されるURL:
    https://secureXXX.sakura.ne.jp/example.com/shop/SSL1(.*)
    https://secureXXX.sakura.ne.jp/example.com/shop/SSL2(.*)
    https://secureXXX.sakura.ne.jp/example.com/shop/form(.*)
    ※(.*)は変化する

    ■うまく行かなかったhtaccess
    ▽http://www.example.com/.htaccess
    # 「wwwあり」に統一
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^example\.com
    RewriteRule ^(.*) http://www.example\.com/$1 [R=301]

    # HOMEは/shop/
    RewriteRule ^index(.*) /shop/ [R=permanent,L]

    ▽http://www.example.com/shop/.htaccess
    # 共有SSLの場合は別ドメインへアクセス
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^example\.com [OR]
    RewriteCond %{HTTP_HOST} ^www\.example\.com
    RewriteRule ^(.*) https://secureXXX.sakura.ne.jp/example.com/shop/$1 [R]
  • id:rouge_2008
    すみません。
    ホストによる条件設定をしていなかった為、共有SSLのURLにもマッチしてループしてしまったと思われます。
    以下のように変更して試してみてください。

    RewriteEngine on
    RewriteBase /

    # 共有SSLの場合は別ドメインへアクセス
    RewriteCond %{HTTP_HOST} ^example.com [OR]
    RewriteCond %{HTTP_HOST} ^www.example.com
    RewriteRule ^shop/(SSL1|SSL2|form)(.*)$ https://secureXXX.sakura.ne.jp/example.com/shop/$1$2 [R,L]

    # HOMEを/shop/に(※shopディレクトリにリダイレクト)
    RewriteCond %{HTTP_HOST} ^www.example.com
    RewriteCond $1 !^(shop)
    RewriteCond $1 !^(js)
    RewriteCond $1 !^(css)
    RewriteCond $1 !^(img)
    RewriteRule ^(.*)$ /shop/$1 [R=301,L]

    #wwwなしをwwwありに変更しつつ、shopディレクトリにリダイレクト
    RewriteCond %{HTTP_HOST} ^example.com
    RewriteRule ^(.*)$ http://www.example.com/shop/$1 [R=301,L]

    画像等の読み込み等については、除外ディレクトリを追加すれば大丈夫だと思います。(※上記は追加してあります。)
    ※「http://www.example.com」へのアクセスについては、「shop」ディレクトリにリダイレクトしなくても良いのでしたら、「# HOMEを/shop/に(※shopディレクトリにリダイレクト)」の下の6行は削除して試してください。

    また、画像等を絶対パスで指定している場合は、上手く表示されない事もあるようですので、相対パスに変更して試してみてください。
    http://faq.sakura.ad.jp/faq/1032/app/servlet/qadoc?000735
  • id:rouge_2008
    すみません。
    「http://example.com」へのアクセスがあった場合は、どのディレクトリへのアクセスであっても「shop」ディレクトリにリダイレクトするだけでいいのですよね?
    「#wwwなしをwwwありに変更しつつ、shopディレクトリにリダイレクト」のRewriteRuleのリダイレクト先から$1を削除して、以下のようにしてください。

    #wwwなしをwwwありに変更しつつ、shopディレクトリにリダイレクト
    RewriteCond %{HTTP_HOST} ^example.com
    RewriteRule ^(.*)$ http://www.example.com/shop/ [R=301,L]
  • id:icta
    rouge_2008さん、ご回答ありがとうございます。
    >以下のように変更して試してみてください。
    早速変更したのですが、残念ながら前回と同じエラーが出てしまいます。

    >「http://example.com」へのアクセスがあった場合は、どのディレクトリへのアクセスであっても「shop」ディレクトリにリダイレクトするだけでいいのですよね?
    私の説明が下手で申し訳ありません。

    ▼以下のURLはすべてhttp://www.example.com/shop/にリダイレクトします。
    http://example.com
    http://example.com/
    http://example.com/index.html
    http://example.com/index.php
    http://example.com/index.cgi
    http://example.com/shop/
    http://www.example.com
    http://www.example.com/
    http://www.example.com/index.html
    http://www.example.com/index.cgi
    http://www.example.com/index.php

    /shop/以下にCGIがあります。ページが動的に生成されるためドメイン名でアクセスされた場合、/shop/へリダイレクトしたいのです。

    /shop/以外のディレクトリは単に、wwwありだけにします。
    http://example.com/img/→http://www.example.com/img/
    http://example.com/js/→http://www.example.com/js/

    javascript、css、画像はすべて相対パスで指定しています。
    そのため最初のコメントには次のように記載しました。
    # HOMEは/shop/
    RewriteRule ^index(.*) /shop/ [R=permanent,L]

    サイト内のページを遷移する<a>タグはhttps/httpの両ページとも絶対パスで指定しています。
    相対リンクだと、httpsのページからHOMEへ遷移するHOMEもhttpsのページになってしまうためです。

    ▼HOME、https以外のページ
    <a href="http://www.example.com/shop/">
    <a href="http://www.example.com/shop/hogehoge.cgi?xxxx">
    <a href="http://www.example.com/about/">

    ▼httpsのページ
    <a href="https://secureXXX.sakura.ne.jp/example.com/shop/ssl1.cgi?xxxxx">
    <a href="https://secureXXX.sakura.ne.jp/example.com/shop/form.html">

    ループしてしまうのは、HOMEを/shop/としていたり、リンクを上記のように絶対パスで指定しているためでしょうか?
    最初は正規表現で簡単に実現できると考え、いろいろ試したのですがやはりhttpsの場合のループにはまってしまいました。
    何か良い方法を思いつきましたら教えていただければうれしいです。
  • id:rouge_2008
    すみません。
    原因は分からないのですが、とりあえず以下を試してみてください。

    # 共有SSLの場合は別ドメインへアクセス
    RewriteCond %{HTTP_HOST} !^secureXXX.sakura.ne.jp
    RewriteRule ^shop/(SSL1|SSL2|form)(.*)$ https://secureXXX.sakura.ne.jp/example.com/shop/$1$2 [R,L]

    もし、他に条件を記述していたら、他の条件は一旦コメントアウトしてみてください。
    ※今回回答した他の記述(「#wwwなしをwwwありに変更しつつ、shopディレクトリにリダイレクト」等)はそのままで大丈夫です。
  • id:rouge_2008
    > /shop/以外のディレクトリは単に、wwwありだけにします。
    すみません。見落としていました。
    対応させてみたのでお試しください。

    RewriteEngine on
    RewriteBase /

    RewriteCond %{HTTP_HOST} !^secureXXX.sakura.ne.jp
    RewriteRule ^shop/(SSL1|SSL2|form)(.*)$ https://secureXXX.sakura.ne.jp/example.com/shop/$1$2 [R,L]

    # HOMEを/shop/に(※shopディレクトリにリダイレクト)
    RewriteCond %{HTTP_HOST} ^www.example.com
    RewriteCond $1 !^(shop)
    RewriteCond $1 !^(js)
    RewriteCond $1 !^(css)
    RewriteCond $1 !^(img)
    RewriteRule ^/?(index\.(html|php|cgi))*$ /shop/ [R=301,L]

    #wwwなしのトップページにアクセスされた場合、wwwありのshopディレクトリにリダイレクト
    RewriteCond %{HTTP_HOST} ^example.com
    RewriteRule ^/?(index\.(html|php|cgi))*$ http://www.example.com/shop/ [R=301,L]

    #wwwなしのshopにアクセスされた場合、wwwありのshopにリダイレクト
    RewriteCond %{HTTP_HOST} ^example.com
    RewriteRule ^/?shop/?(.*)$ http://www.example.com/shop/ [R=301,L]

    #上記以外のwwwなしのページをwwwありにリダイレクト
    RewriteCond %{HTTP_HOST} ^example.com
    RewriteCond $1 !^(shop)
    RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]


    SSLページのループについてですが、実際にさくらで試すことが出来ませんので、こちらでは状況が良く分かりません。
    .htaccess未設置の状態で、「https://secureXXX.sakura.ne.jp/example.com/shop /SSL1.cgi」や「https://secureXXX.sakura.ne.jp/example.com/shop/form.html」に直接アクセスした場合は、アドレス欄のURLが変更にならずに表示されるのでしょうか?
    上記SSLページへのリダイレクト以外(wwwありへの変更等)は、.htaccessが動作しているかどうかも教えてください。

    ※一部記述に間違いがあったので再投稿しています。
  • id:icta
    rouge_2008さん、ご回答ありがとうございます。
    やはりSSLページがループしてしまうので、いろいろ検証してみるため少しお時間をいただけますでしょうか。
    検証が終わりましたらご報告いたします。
  • id:rouge_2008
    こちらこそすみません。
    以下ではいかがでしょうか?

    RewriteCond %{HTTP:X-Forwarded-For} ^$
    RewriteRule ^shop/(SSL1|SSL2|form)(.*)$ https://secureXXX.sakura.ne.jp/example.com/shop/$1$2 [R,L]

    http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=4595&forum=2&post_id=21124


    以下の条件で動作している人もいるようですし、ブラウザのキャッシュを削除してから試してみてください。

    RewriteCond %{HTTP_HOST} ^example.com [OR]
    RewriteCond %{HTTP_HOST} ^www.example.com


    こちらは大丈夫ですので、時間がある時に試してみてください。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません