.htaccessによって、PCと携帯端末を振り分けようとしています。


http://d.hatena.ne.jp/ALMIC/20060727

こちらのURLを参考にまずは以下を付け加えて、
docomoから動作確認してみましたが全く機能しません。


RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} DoCoMo
RewriteRule ^$ http://example.com/a/test.cgi [R]


そこでこちらを参考に、
http://labs.vone.jp/2007/07/17/htaccess/

1行目のOptions FollowSymLinksを追加してみましたが、
今度は「HTTP エラー 403 - アクセス不可」となり、PC、携帯からもアクセスが不可能となりました。

どこに問題があるか教えてください。お願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2007/12/29 17:40:47
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:nandedarou No.2

回答回数230ベストアンサー獲得回数34

ポイント100pt
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} .*DoCoMo.*
RewriteRule ^$ http://example.com/a/test.cgi [R,L]

として見て下さい。

解説します。

 

+をつけないと、この.htaccessより上位のレベルでこのディレクトリに対して設定されている内容が解除されてしまいます。

http://59.106.2.6/manual/mod/core.html#options

 

.*DoCoMo.*は、DoCoMoの前後に何か文字があってもいいってことです。

無くてもいいのかも知れませんが、念の為付けてみて下さい。

 

Lは、リダイレクトの後、終了するってことです。マニュアルでそうしたほうがいいって書いてあります。

http://www.net-newbie.com/trans/mod_rewrite.html

読みたい場合は、「redirect|R」をこのページ内で検索して、その下の「注意」を読んで下さい。

その他の回答5件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント19pt

コード的には問題なさそうなので、お使いの Web サーバーが mod_rewrite が使用可能かどうかを確認してください。

単にモジュールが使えないだけに見えます。


1行目のOptions FollowSymLinksを追加してみましたが、

今度は「HTTP エラー 403 - アクセス不可」となり、PC、携帯からもアクセスが不可能となりました。

こちらは該当の設定が許可されていないのでしょう。

特に mod_rewrite の動作には関係ありません。

id:tontonpokopoko

回答をありがとうございます。

サーバはxreaで、mod_rewriteは使えるようです。

(ただ設定に問題があるのでしょうか・・)

試しに違うサーバ(マイティ)でも設置してみましたが、

まったく同じ現象が起きてしまいました。

何か単純なミスをしているような気がするのですが・・

2007/12/28 15:23:02
id:nandedarou No.2

回答回数230ベストアンサー獲得回数34ここでベストアンサー

ポイント100pt
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} .*DoCoMo.*
RewriteRule ^$ http://example.com/a/test.cgi [R,L]

として見て下さい。

解説します。

 

+をつけないと、この.htaccessより上位のレベルでこのディレクトリに対して設定されている内容が解除されてしまいます。

http://59.106.2.6/manual/mod/core.html#options

 

.*DoCoMo.*は、DoCoMoの前後に何か文字があってもいいってことです。

無くてもいいのかも知れませんが、念の為付けてみて下さい。

 

Lは、リダイレクトの後、終了するってことです。マニュアルでそうしたほうがいいって書いてあります。

http://www.net-newbie.com/trans/mod_rewrite.html

読みたい場合は、「redirect|R」をこのページ内で検索して、その下の「注意」を読んで下さい。

id:tezcello No.3

回答回数460ベストアンサー獲得回数69

ポイント100pt

実際のディレクトリ構成が分からないので、FollowSymLinks が必要なのかどうかは分りません。

(Webサーバの設定にもよりますし...)

403エラーとの事ですから、リライト動作そのものはできているような気がしますが...

http://www.studyinghttp.net/status_code#Code403


ログには何か残っていませんか?(予定通りの動作をしていないときは、ログを調べるのが近道です)

Webサーバのログを調べてみてはどうでしょう。

できれば、rewrite のログも-> http://www.net-newbie.com/trans/mod_rewrite.html#RewriteLog

なぜアクセスが拒否されたかがわかれば、解決方法がわかると思います。


> docomoから動作確認してみましたが全く機能しません。

こちらも、rewrite のログをとってみれば原因がつかめるのでは?

id:tontonpokopoko

回答をありがとうございます。

もっとものことだと思うのですが、

個別ログの詳細を調べたことがなく、また調べ方も知らないのです。

簡単なものではないでしょうから、いずれ違うタイトルで相談させていただきます。

(もし簡単な方法なら教えていただきたいですが・・)

2007/12/28 15:37:46
id:nandedarou No.4

回答回数230ベストアンサー獲得回数34

ポイント18pt

補足

前回の私の回答でダメなら、次のように、^$の間に/を入れてみて下さい。

RewriteRule ^/$ http://example.com/a/test.cgi [R,L]
id:tontonpokopoko

いろいろとありがとうございます。

Options +FollowSymLinks

RewriteEngine On

RewriteCond %{HTTP_USER_AGENT} .*DoCoMo.*

RewriteRule ^/$ http://example.com/a/test.cgi [R,L]

前回の回答、そして上記の「/」を入れて動作確認していますが、

希望のページにはドコモから飛べません。

(補足 403エラーは解除されましたが)

.htaccessの設置がおかしいのではと思い、最初の状態、

Options +FollowSymLinks の「+」をとり、

下記のエラーページを作り確認したところ正常にジャンプしました。

ErrorDocument 403 http://b.html

「単にモジュールが使えない」かと今確認している途中です。

サーバは"xrea"

2007/12/28 15:01:59
id:tezcello No.5

回答回数460ベストアンサー獲得回数69

ポイント18pt

http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html

>>ただ、これらすべての機能や柔軟性が、欠点や複雑さの元にもなって います。なので、このモジュール全体を一日程度で覚えようなどとは 思わないほうがいいでしょう。<<

なんてサイトに書かれている位なので、一歩一歩チェックしてみましょう。

自宅サーバでなければ、詳細のログを得るのは難しいかも知れませんね。

(Xrea ではApacheのエラーログは取れないみたい...、httpd.conf も変更できないからrewriteのログも不可なようで...)


サーバは、Xrea という事なので、「ホームディレクトリでは」有効になっているはずです。

.htaccess を置いているディレクトリの上位で FileInfo の上書を不可にしていなければですが。大丈夫ですか?

http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteEng...


RewriteEngine On
RewriteRule ^(.*)$ test.txt

だけ書いた .htaccess とテスト用のページ test.txt をホームディレクトリの public_html に置いて、ブラウザからそのディレクトリにアクセスしてみます。(例えば、http://www.hoge.com/

正常に動いているのなら、http://www.hoge.com/ でも、http://www.hoge.com/index.html でも test.txt が表示されるはずです。


これがOKなら、後は条件やリダイレクト先を記述すればいいはず。

id:tontonpokopoko

tezcelloさん回答をありがとうございます。

上記のコードで試したところテスト先にジャンプしました。

懸念のとおりディレクトリの上位にすでに”.htaccess”を置いていたために、

正常に動作しなかったようです。

今回のテストは上位の.htaccessに入れ替えて実行したのですが、

そのまま上位の.htaccessを残したまま下位で機能させるにはどうすればいいのでしょうか?

現状では”ディレクトリの上位でFileInfo の上書を不可”にしてしまっているということなのでしょうか?

自分でも今から調べて見ますが、いいアドバイスがあったらまたお願いいたします。

2007/12/28 18:02:48
id:nandedarou No.6

回答回数230ベストアンサー獲得回数34

ポイント18pt

あっと、書き込もうと思ったら、5番目の回答者様と似たような内容です。ただ、違う点もあるので、重複する内容もありますが、とりあえず、回答します。

 

cgiの動作設定の問題とも考えられますが、とりあえず、次の実験をして見てくれませんか?

(1)テキストエディタ(Windowsのメモ帳等でもOK)で、This is test.htmと書いて、test.htm という名前で保存する。

(2)作成したtest.htmを.htaccessと同じフォルダに入れる。

(3).htaccessに次のように書く。

※実験する内容以外は、コメントアウトするか、まったく書かないで下さい。行頭に#を入れると、その行はコメントアウトされ、無効になります。

(4)インターネットから、アクセスしてみる。

※アクセスするURLの最後にtest.htmとは書かないで下さいね。そんなことをしたら、リライトのテストになりませんから。

RewriteEngine on
RewriteRule ^$ test.htm [L]

This is test.htmと表示されれば、成功ですね。その場合、mod_rewriteは、導入されています。

★成功したものを少しずつ修正していって、失敗したら、失敗した直前に修正したものが原因です。いろいろやって、確かめて見て下さい。

※PCのブラウザ等で動作チェックする場合、キャッシュが邪魔をすることがあります。リロード(再読込)で大丈夫な場合もありますが、一旦ブラウザを閉じて再立ち上げする方が確実です。

なお、

Options +FollowSymLinks の+はとらない方がいいと思います。理由は、最初の回答のとおり。

私もxreaも使っていますが、Options の指定がまったく無くても、動きました。また、^$の中に/は不要でした。

次のURLのページで、mod_rewriteという文字が検索して見つかれば、導入されていると思われます。

http://www.サーバ名.xrea.com/index.php

※サーバ名には、xreaからレンタルしたサーバの記号を入れてください。

※回答受付中もコメントできる設定にするれば、アドバイスし易くなります。他の方からも、多くのアドバイスがもらえる可能性がありますよ。

id:tontonpokopoko

nandedarouさん、丁寧な説明を何度もありがとうございます。

前の方の返信にも書きましたが、テストをしてみてmod_rewriteは正常に働いているようです。

ただ.htaccessを下位に設置すると効果がなくなることを今調べています。

「FileInfo の上書の不可」というのが問題なのでしょうか・・

また”回答受付中もコメント”について教えてくださってありがとうございます。

今後はそうさせていただきます。

2007/12/28 18:35:59
  • id:nandedarou
    コメントの設定ありがとうございます。それでは、少しずつ変更して、実験しましょう。
    test.txtを「a」フォルダに移動して、うまく行った、上位の.htaccessの記述を次のように変更してみて下さい。
    RewriteEngine On
    RewriteRule ^(.*)$ http://example.com/a/test.txt [R]
    その上位のディレクトリにアクセスすると、http://example.com/a/test.txtへ飛びますか?実験してみて下さい。
  • id:tontonpokopoko
    nandedarouさん、コメントをありがとうございます。
    現状でサイトが運営されているので、すべての人がそのページに飛んでしまうので困っています。

    私のIPだけとかそういった方法があるといいのですが・・
    あ、ドコモだけなら仕方ないので、もう1度上位でドコモでテストしてみてはどうでしょうか?
  • id:nandedarou
    ドコモでaィレクトリのtest.htmにアクセスできたら、
    次のように変更して、aディレクトリのtest.cgiにもアクセスできるか確かめて下さい。
    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} DoCoMo
    RewriteRule ^(.*)$ http://example.com/a/test.cgi [R]
  • id:tontonpokopoko
    コメントをありがとうございます。
    うーん・どうしてでしょうか、2行目を追加してドコモからアクセスしても効果がジャンプしないでそのまま表示されてしまいます。
  • id:tontonpokopoko
    あ、他のページにアクセスしたらドコモからも正常にジャンプしました。キャッシュが残ると見えてしまうのでしょうか。
    このまま作業を続けていきます。
    ここには5分以内の連続書き込みは出来ないんですね。
    申しわけありません、慎重にコメントします。
  • id:nandedarou
    test.cgiが見れたということですね?やはり、最初にあった、上位の.htaccessの問題でしょうか?
    可能ならば、その.htaccessの記述を見せて頂けますか?具体的な部分は、別の文字に変更してもいいです。
    ※直前のコメントを削除すると、すぐにコメントできるかも…。(←違うかも)
  • id:nandedarou
    あっと、.htaccessを見せてもらう前に、次のテストをお願いします。
    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} DoCoMo
    RewriteRule ^(.*)$ http://example.com/a/test.cgi [R]
    これを質問の時点で置いていたディレクトリに置いて、そのディレクトリにアクセスして見てください。その際、最初のトップディレクトリにもともとあった.htaccessを設置しない場合とした場合で、両方試して下さい。
  • id:tontonpokopoko
    ありがとうございます。
    test.cgiが見れたので
    こちら↓の作業を行なっています。

    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} DoCoMo
    RewriteRule ^(.*)$ http://example.com/a/test.cgi [R]
    これを質問の時点で置いていたディレクトリに置いて、そのディレクトリにアクセスして見てください。その際、最初のトップディレクトリにもともとあった.htaccessを設置しない場合とした場合で、両方試して下さい。

    また結果を報告させていただきます。
  • id:tontonpokopoko
    nandedarouさん、いろいろと本当にありがとうございます。
    どうやら私の環境だと

    RewriteRule ^(.*)$ http://example.com/a/test.cgi [R]

    の、”(.*) ” を加えると正常に動作するようです。
    この記号ははどういう意味なのでしょうか・・?

    これからまだテストしようと思いますが、
    携帯端末を1つのページにまとめるコードは以下でよろしいでしょうか?

    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} DoCoMo
    RewriteCond %{HTTP_USER_AGENT} J-PHONE [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} Vodafone [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} SoftBank [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} MOT- [NC]
    RewriteCond %{HTTP_USER_AGENT} UP.Browser [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} KDDI [NC]
    RewriteRule ^(.*)$ http://example.com/a/test.cgi [R]

  • id:nandedarou
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{HTTP_USER_AGENT} DoCoMo [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} J-PHONE [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} Vodafone [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} SoftBank [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} MOT- [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} UP\.Browser [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} KDDI [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} WILLCOM [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} DDIPOCKET [NC]
    RewriteRule ^(.*)$ http://example.com/a/test.cgi [R]
    これで、うまく行くか確かめてもらえますか?
    うまくいったら、(.*)を/に変更して、テストして見てください。
    結果を聞いて、この記述の解説をします。
  • id:tontonpokopoko
    何度かトライしましたが、
    上記のコードだとドコモ、au、ともにジャンプしません・・
    もう少し試してみます。
  • id:tontonpokopoko
    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} DoCoMo
    RewriteRule ^(.*)$ http://example.com/a/test.cgi [R]

    RewriteCond %{HTTP_USER_AGENT} J-PHONE [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} Vodafone [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} SoftBank [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} MOT- [NC]
    RewriteRule ^(.*)$ http://example.com/a/test.cgi [R]

    RewriteCond %{HTTP_USER_AGENT} UP.Browser [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} KDDI [NC]
    RewriteRule ^(.*)$ http://example.com/a/test.cgi [R]

    としたらドコモ、au、からは動作しているようです。
    スマートではないですが、何とかここまでこれました。
    お付き合いいただいて本当に感謝しています。
  • id:nandedarou
    ORの連続に制限があるのかな?

    うーん、なんか上記の.htaccessを置いたディレクトリより、下位にアクセスしているような気がしますね。私の勘違いかなぁ…。ちょっと気になりますが、思ったように動作しているなら、問題ありませんね。

    (.*)の意味ですが、
    .は全ての文字、*は直前の文字の繰り返し、()をした部分は$1という変数に代入され、後で、参照することができます。今回は()は無くてもいいです。
    正規表現という表記法です。これを使いこなせると便利ですよ。

    それでは、頑張って下さい。
  • id:tontonpokopoko
    お返事をありがとうございます。
    申しわけありません、下位にジャンプさせています↓
    (RewriteRule ^(.*)$ http://example.com/test/mobile/index.cgi [R])

    出来たと思いましたが、また問題にぶつかってしまいました。
    .htaccess が違うフォルダにあるときはしっかりと

    ”http://example.com/test/mobile/index.cgi”にアクセスするのですが、

    testフォルダに.htaccessを設置をすると、index.cgiには飛ばされずに、
    何故かアクセス制限されてしまいます。(ドコモは302エラー、auは403エラー)
    またいろいろ試してみますが、いいアドバイスがあったら是非教えてください。
    お願いいたします。 (現状はマイティサーバでテスト中です)
  • id:tezcello
    実際の名前でなくていいので、ディレクトリ構造を教えて下さい。
    > 現状でサイトが運営されているので、すべての人がそのページに飛んでしまうので困っています。
    > 私のIPだけとかそういった方法があるといいのですが・・
    http://example.com/test/ (実体は、ホームディレクトリ下の public_html/test/)以下が質問者さんのが自由に使える所(または分担の所)という事でしょうか?

    それと、携帯(あるいはPC)でアクセスする際のURLはなんでしょう?
    これも、http://example.com/test/ でしょうか?

    さらに、実際にアクセスさせたいのは、http://example.com/test/mobile/index.cgi という事でよろしいですか?

    この時に、Xrea ならホームディレクトリの設定が以下のようになっているはずなんですが、ホームディレクトリに設置している .htaccess で何を設定しているかが気になります。(設置ディレクトリによって動作が違うので)
    AllowOverride FileInfo Options
    Options +FollowSymLinks

    ただし、ホームディレクトリで上書き禁止にしているといくらこれを書いても効果がないです。


    > ドコモは302エラー
    RewriteRule のフラグの説明で、
    'redirect|R [=code]' (強制 redirect)
    Substitution の前に (新しい URL を URI にする) http://thishost[:thisport]/ をつけることにより強制的な外部リダイレクションを行ないます。 code が指定されない場合、HTTP レスポンスの 302 (MOVED TEMPORARILY) が使われます。
    とあるので、その為では?
    要するに、思うように書き換え出来ていないのでは無いかと思います。

    置き換え文字列に、http://自分のホスト名 を付けると自動的に削除してしまうようだし、Rフラグをつければ、自動的にhttp://自分のホスト名 を付加する(単に付けるだけでジャンプする訳ではないので、Lフラグも付けるべきだそうです)ようなので、
    RewriteRule ^(.*)$ /test/mobile/test.cgi [R,L]
    でいいみたいですね。
    .htaccess のあるディレクトリの下位に飛ぶだけなら、Rフラグを付けなくてもいいような気がするんですけど...

    で、以下を書いた.htaccess を public_html/test/ に設置ると、全部のアクセスが /test/mobile/test.cgi になると思うのですが、どうでしょうか?
    AllowOverride FileInfo Options
    Options +FollowSymLinks
    RewriteEngine On
    RewriteRule ^(.*)$ /test/mobile/test.cgi [R,L]

  • id:tontonpokopoko
    tezcelloさん、nandedarouさん、お返事をありがとうございます。
    今から記載されたもの試しますが、まずはディレクトリを書き残します。
    とりあえずマイティサーバで話を進めさせていただきます。

    httpsdocs(以下が使用可)

      index.html(トップページ)
      .htaccess(PHPをインクルード、*コード↓)

      ├Aフォルダ
      ├Bフォルダ
      ・
      ・
      ├ test/test.cgi(PC用の掲示板本体)
          /.htaccess (今回設置)
         ├ mobile/index.cgi(携帯用掲示板本体)

    *掲示板ログはPC、携帯、共有。
    携帯版は何故かPCより1つ下の階層に設置してしまった。
    やりたいことは”test.cgi”にアクセスした携帯ユーザを
    ”test/mobile/index.cgi”にジャンプさせること。

    *上位の.htaccessのコード
    Options ExecCGI Includes
    AddHandler cgi-script .cgi
    AddType application/x-httpd-php .php .html
  • id:tontonpokopoko
    補足
    httpsdocs → httpdocs の間違いです
  • id:tontonpokopoko
    tezcelloさん。
    以下をxreaで試したところ500エラーになります。
    また最初の1行を抜かすと、PCからは無限ループのような状態です。
    (画面に何も表示されず、カチカチと高速で何かを表示しようと繰り返す)

    AllowOverride FileInfo Options
    Options +FollowSymLinks
    RewriteEngine On
    RewriteRule ^(.*)$ /test/mobile/test.cgi [R,L]
  • id:tezcello
    > PCからは無限ループのような状態です。
    あ~ごめんなさい。Rフラグを付けない方が...と言いながら、ちゃんと考えて無かったです。

    ドキュメントルートの .htaccess は、Options は+を使うべきだと思います。
    (でないと、他はすべて無効になる)
    Includes は、SSIを使うのであれば必要ですので、どこかのページで使っているんですね。

    > 500エラー
    これがでる時は、CGIなどのプログラムがおかしいか、.htaccess のミスを疑います。
    書き換え後の test.cgi を test.txt に変更(もちろんtest.txtファイルを用意しないとダメですけど)しても出るのなら、.htaccess にミスがあります。(スペルミスとかも含む)
    Options の全項目の上書が許されていないのかも知れませんし、各ディレクトリにかけられた設定が矛盾するのかも知れません。

    > やりたいことは”test.cgi”にアクセスした携帯ユーザを
    > ”test/mobile/index.cgi”にジャンプさせること。
    ならば、/test/.htaccess は
    AllowOverride FileInfo
    Options +FollowSymLinks
    RewriteEngine On
    RewiteBase /test
    #RewriteCond %{HTTP_USER_AGENT} DoCoMo
    RewriteRule ^test\.cgi /test/mobile/index.cgi [L]

    という感じでどうでしょう?
    1行目の Options を削除しましたが、上位ディレクトリで Options を変更できているので上書は可能になっている為です。(1行目が全部不要かも知れません)
    2行目は上位ディレクトリの .htaccess の Options を+付きで書けば不要かも知れません。
    4行目は置換え後の文字列の起点が .htaccess を置いたディレクトリからとなるようにする為のもので、RewriteRule で置換え後文字列を例のようにルートから書くのなら不要です。
    5行目はコメントアウトしていますが、置換えが機能するようになったら有効にして携帯のみ書き換えするようにして下さい。(これだけでは足りませんが、例という事で)
    外部リダイレクトにすると無限ループになるので、Rフラグを外しました。
  • id:tontonpokopoko
    tezcelloさん、nandedarouさん再三のお返事をありがとうございます。
    とりあえず作業が追いついていないのですが、現状を報告します。

    (1)まず、.htaccessを削除して、public_html/test/フォルダにtest.txtを置いて、PCのブラウザで、http://example.com/test/test.txtにアクセスして、test.txtが表示されるか確かめてください。
    ============
    表示されます。

    (2)
    RewriteEngine On
    RewriteRule ^.*$ test.txt [L]
    ============

    test.txt が表示されます。

    (3)
    RewriteEngine On
    RewriteRule ^/$ test.txt [L]
    ============

    403エラーになります。

    (4)
    RewriteEngine On
    RewriteRule ^$ test.txt [L]
    ============

    test.txt が表示されます。


    (5)
    RewriteEngine On
    RewriteRule ^$ http://example.com/test/test.txt [R,L]
    ============

    test.txt が表示されます。
    (URLが正常にtest.txtまで記載されうようになった)

    (6)
    RewriteEngine On
    RewriteRule ^$ http://example.com/test/mobile/index.cgi [R,L]
    ※もし、(3)が成功したなら、^$は、^/$に修正して下さい。
    ============

    test.txt が表示されずにmobile/index.cgiが表示されます。

    ============

    これはうまくいったということでしょうか?
    また新たに書かれた作業を進めて見ます。
  • id:nandedarou
    何度も書き換えしてしまいました。すみません。
    tezcelloさんが私より先に気付かれたようですので、内容が重複していたので消しました。
    なお、Rフラグをつけても、(.*)でないので、無限ループしないと思います。
    > やりたいことは”test.cgi”にアクセスした携帯ユーザを
    > ”test/mobile/index.cgi”にジャンプさせること。
    これを最初に聞くべきでしたね…。
  • id:tezcello
    > RewriteEngine On
    > RewriteRule ^$ http://example.com/test/mobile/index.cgi [R,L]
     (略)
    > test.txt が表示されずにmobile/index.cgiが表示されます。
    > これはうまくいったということでしょうか?
    これは、http://example.com/test/ または http://example.com/test でのアクセスではないでしょうか?

    ご希望の、http://example.com/test/test.cgi へのアクセスだと違う結果になるように思いますがどうでしょうか?
  • id:tontonpokopoko
    >ご希望の、http://example.com/test/test.cgi へのアクセスだと違う結果になるように思いますがどうでしょうか?

    その通りでした。
    http://example.com/test/test.cgi にアクセスするとそのまま表示されます。

    今tezcelloさんのコードをコピーして試したのですが、やはり500エラーになります。もう少し確かめます。






  • id:nandedarou
    > これはうまくいったということでしょうか?
    このテストを依頼した時点での想定では、成功です。(tezcelloさんの言うように、http://example.com/test/test.cgi へのアクセスだとダメだと思います。)このテストで、tontonpokopokoさんのサーバの動作環境がつかめました。

    テスト結果報告ありがとうございました。下記のコードで、携帯からhttp://example.com/test/test.cgiにアクセスするとhttp://example.com/test/mobile/index.cgiが表示されると思います。

    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} DoCoMo [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} J-PHONE [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} Vodafone [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} SoftBank [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} MOT- [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} UP\.Browser [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} KDDI [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} WILLCOM [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} DDIPOCKET [NC]
    RewriteRule ^test\.cgi$ http://example.com/test/mobile/index.cgi [QSA,R,L]

    ※Rフラグをつけても、^test\.cgi$の場合、無限ループしません。tezcelloさんのおっしゃるように、リダイレクト不要ならば、Rフラグを外してもいいと思います。いろいろやってみて下さい。
    ※QSAは、URLの?以降(クエリ文字列)を引き継ぐという意味です。つけておいた方が、無難だと思います。
    ※RewriteCondの最後の二つはWILLCOMの携帯です。携帯の仲間に入れてやってください…。^^;
    ※最後のRewriteCondには、ORを入れないでいいです。
    ※UP\.Browser の\は、事実上無くても動作しますが、正規表現の正しい書き方としては、つけるべきだと思います。
    ※Browserの前にスペースが入る機種も存在するようですが、上記のコードはその対策はしていません。
  • id:tezcello
    Xrea で試すのなら、ドキュメントルートの Options を+付きに変更すれば、/test/.htaccess は
    RewriteEngine On
    RewriteRule ^test\.cgi /test/mobile/index.cgi

    の2行だけでいい様に思います。(僕のXreaでも特に何もしないで動作しています。)
  • id:tontonpokopoko
    うまくいきました!
    nandedarouさんのコードでxreaでは正常に動作いたしました。
    とりあえずドコモとauで動いたので、他の端末も大丈夫だと思います。
    わかりやすく丁寧な回答を本当にありがとうございました。

    Rフラグを外して試したところ、
    何故か画像が表示されないので現状のまましばらく使ってみます。

    今回は私のような素人のために、お時間をたくさん使っていただいて本当に感謝です。
    またよろしくお願いいたします!

    これからマイティの方でも同じように試してみます。
    またつまづきそうで怖いですが・・
  • id:tezcello
    クエリを特に操作していないので、QSAフラグは無くてもいいのでは?>nandedarou さん
    外部リダイレクトの問題は、書き換えをするのは携帯だけなので、ブラウザのURL欄の内容が元々アクセスしただろうが書き換え後のアドレスだろうが問題は無いのでしょうけど。
    書き換え後のアドレスをブックマークして欲しいとかなら、外部リダイレクトするべきでしょうね。
    個人的には、サイト構成の変更を考えると常に同じ所にアクセスしてもらう方が気に入っています。
    (なので、外部リダイレクトはしません)

    > 何故か画像が表示されないので現状のまましばらく使ってみます。
    画像のアドレスが、ルートからのアドレスではなくて、cgiからの相対アドレスになってる...って事は無いですか?
  • id:nandedarou
    ●>クエリを特に操作していないので、QSAフラグは無くてもいいのでは?>nandedarou さん
    つけなくてもいい場合もありますが…。ないとクエリが引き継がれないですよね?不要の場合でも付けて問題ないので、つけた方が無難であることは確かだと思います。

    ●Rフラグをつけるべきか否かの判断は、実際にやってみてうまく行く方を採用して下さい。

    Rフラグをつけるか否かでの違について、私が今、パッと思いつくのは以下の点です。
    index.cgiで表示されるページにいろんなリンクがあると思いますが、リンク先のURL(←aタグのhref属性)の値が、★相対アドレスの場合に違いが出ます<a href="hoge.htm">ほげへのリンク</a>とリンクがあった場合、このリンクをクリックすると
    ★Rフラグをつけた場合は、/test/mobile/hoge.htmにアクセスしようとしますが、
    ★Rフラグをつけない場合は、/test/hoge.htmにアクセスしようとします。
    mobileフォルダの中に携帯用のhtmがある場合は、Rフラグをつけないとダメですね。
    常に、index.cgiにしかアクセスしない設計ならば、どちらでも動作すると思います。この場合、クエリ文字列で画面遷移していると思われますので、QSAフラグは必須になります。
    ★すべてのリンク先のURLをhttp://から記載している場合(絶対アドレスの場合)は、上記の違いはでません。Rフラグをとっても構わないのではないかと思います。

    Rフラグをとる場合は、最後の一行は(http://~でもいいはずですが…)次のがいいと思います。
    RewriteRule ^test\.cgi$ mobile/index.cgi [QSA,L]
  • id:nandedarou
    >mobileフォルダの中に携帯用のhtmがある場合は、Rフラグをつけないとダメですね。
    と書きましたが、Rフラグをつけなくても<a href="mobile/hoge.htm">ほげへのリンク</a>と書けばもちろん可能です。
    いずれにせよ、Rフラグをつけるかどうかで違いが出ることが多いと思われますので、注意してください。
  • id:tezcello
    > つけなくてもいい場合もありますが…。ないとクエリが引き継がれないですよね?
    うちのローカルサーバでテストしてみた所、QSAフラグを付けなくてもクエリを渡してくれますがうちのサーバだけでしょうか?

    > クエリを特に操作していないので、QSAフラグは無くてもいいのでは?>nandedarou さん
    チョッと個人的な趣味が入ってしまいましたね。ごめんなさい。

    > 不要の場合でも付けて問題ないので、つけた方が無難であることは確かだと思います。
    後で見直した時になぜ付いているのか疑問になってしまう(どっちでもいいとか、無難であるいう結論はなかなか見つからない)ので、不要なら付けないようにしていたものですから...

  • id:nandedarou
    なるほど、「QSA,」は、削除した方がいいかも知れません。

    >うちのローカルサーバでテストしてみた所、QSAフラグを付けなくてもクエリを渡してくれますがうちのサーバだけでしょうか?
    今実験してみたら、クエリ部分の操作をしてない場合は、デフォルトで引き継がれるのですね。tezcelloさんの言うとおり、今回はクエリ部分の操作をしてないので、QSAフラグは不要ですね。

    >つけた方が無難
    私も自分でやるときは、不要なものはつけないことが多いのですが、人に教えるときには、私がいつもついていてあげられるわけではないので、後々の変更にも耐えられる方を教えることもあります。
    今回は、QSAフラグがないとクエリが引き継がれないと勘違いしていて、さらに、CGIにクエリでパラメータを送る可能性が高い為、付けるのをお勧めしましました。
  • id:tontonpokopoko
    tezcelloさん、nandedarouさん、何度もありがとうございました。
    マイティサーバのほうでも正常に動作しているようです。
    (こちらでは1行目に”Options +FollowSymLinks”をつけないとエラーとなる)

    Rフラグ、QSAフラグにつきましては、つけても問題がないなら継続してみます。
    (1番いやなのはそれでサーバに多大な負荷がかかることですが、平気ですよね?)

    はてなを利用したばかりですが今回は非常に参考になり、また助かりました。
    独学なので今後もCGI,PHPなどで悩むことが多いと思いますが、
    もし困ったときにはまた手助けをしていただけたらと思います。
  • id:tontonpokopoko
    ”いるか”というものが1人にしか渡せないようで申しわけありません。
    またお礼の相場を理解していなく失礼なことだったら重ねてお詫びいたします。
  • id:nandedarou
    QSAフラグについては、どちらでもいいのですが、tezcelloさんのおっしゃるとおり、今回はつけない方がいいかも知れません。

    Rフラグについては、tezcelloさんのおっしゃるとおり、できることならつけない方がスマートです。よって、次のようにするのが一番お勧めです。
    (1)testフォルダの中の全てのファイル名とmobileフォルダの中の全てのファイル名を同じにする。例えば、test/test.cgiではなく、test/index.cgiにする。(ファイル名の変更)
    (2)Rフラグをつけずに.htaccessの最後を次のように変更する。
    RewriteRule ^(.*)$ mobile/$1 [L]
    ※これによって、携帯からのアクセスtestフォルダへのアクセスが全て、mobileフォルダのへのアクセスに変換されます。
    ※先にコメントした相対アドレスの問題も起きません。実態は、mobileフォルダにあるのですが、testフォルダにあるのと同様にhtmlを出力することができます。
  • id:tezcello
    平均受け取りポイントからすれば望外の高ポイントです。ありがとうございます。

    お礼に2つ程...
    それほど速くなくても、小さいPCでローカルのサーバをたてると、お手軽にテスト出来て便利ですよ。仮想化ソフトでもいいかも知れません。
    Mac. は中身はUNIXですから、apache, perl, php も標準装備(設定の変更は必要)で、自宅用としてはお勧めです。

    もしも僕なら、掲示板スクリプトはPC/携帯を分けずにひとつでやれるようにする方向を探すと思います。
    完全にひとつにするのが難しければ、表示部分はPC/携帯それぞれを用意し、掲示板の機能部分はひとつにするとか。(表示部分はユーザに合わせてインクルード)
    掲示板へのリンクがあるページを出力する際にリンクアドレス等を、ユーザに合わせて書き換えるとか。

  • id:nandedarou
    先のコメントで、一番お勧めの方法の(1)は不要でした。もう一度書き直します。
    先程までの.htaccessの最後を次のように変更する。(この場合、Rフラグをつけると無限ループしてしまいます。)
    ★RewriteRule ^(.*)$ mobile/$1 [L]
    ★アクセスする際は、http://example.com/test/index.cgi または、http://example.com/test/ でアクセスする。

    解説
    上記の.htaccessをtestフォルダに置くと、携帯のブラウザからみると、実際のmobileフォルダの中身が、testフォルダにあるように見えます。そして、testフォルダの中身は一切見えなくなります。だから、testフォルダに何があろうが関係ありません。

    tontonpokopokoさん高得点とイルカありがとうございました。
    大事な部分は、tezcelloさんが全て言っておりましたので、申し訳ありません。
  • id:nandedarou
    RewriteRule ^(.*)$ mobile/$1 [L]
    がxreaのサーバでは、うまく動作しませんでした。この書き方も、有名なオープンソースのプログラムの解説書に載っていたので大丈夫だと思ったのですが、私の契約しているサーバでは、動作しませんでした。

    次のようにしたところ、うまく動作しました。
    (1)mobileフォルダをpublic_htmlフォルダの直下に移動し、testフォルダと並列になるようにする。
    (2)public_htmlフォルダの.htaccessに、次のように書く(※このケースでは、testフォルダの.htaccessは、不要です。)
    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} DoCoMo [NC]
    RewriteRule ^test/(.*)$ mobile/$1 [L]
    (3)ドコモ携帯からのtestフォルダへのアクセスが全て、mobileフォルダのアクセスに変換されました。
  • id:tontonpokopoko
    おはようございます。
    tezcelloさん、いろいろとありがとうございます。
    ローカルのサーバは考えたことがあるのですが、また新たに覚えなければいけないことが多そうで後回しにしています。(apacheらのインストールなど)
    でも標準装備なら試してみようかなと思います。Macを使ったことはないのですが。

    掲示板スクリプトは配布されているものを少しずつ改造しているので、現状のような状態になってしまいました。何とかしたいのですけどね。

    nandedarouさん、いろいろと試していただいたようで感謝です。
    mobileの掲示板にブックマークしている人がいると思うので、URLを変えるのに少し抵抗を感じていたんです。(今回のように飛ばしてしまえばいいのかな・・)

    しかしいずれは掲示板を見直すときが来ると思うので、今回のページを再び参考にさせていただきます。お二方、本当にありがとうございました。

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

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

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

回答リクエストを送信したユーザーはいません