質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CMS

CMS(Content Management System)は複数のユーザーでコンテンツを編集することが可能なWebサイトの管理/構築用のプラットフォームを指します。また、会社単位で運用管理するものはECMと呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

549閲覧

PHPでモバイル振り分けしているサイトのモバイルURLのループについて

RaBLEbrigHomeTI

総合スコア11

CMS

CMS(Content Management System)は複数のユーザーでコンテンツを編集することが可能なWebサイトの管理/構築用のプラットフォームを指します。また、会社単位で運用管理するものはECMと呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/06/05 09:57

編集2019/06/05 10:50

前提・実現したいこと

恐れ入ります。質問させていただければと思います。
・PCサイトはルートのアドレス、モバイルからは/mobile/にindex.phpでリダイレクトされている。
・.htaccessなどでは振り分けられていない

・その/mobile/以下にリダイレクトされたURLを、ユーザに直接再共有(非twitterボタン)されて
その共有を見た人にモバイルアクセスされると、
/mobile/mobile/…と共有回数分ディレクトリが増えてしまう

<実現したい点> これを/mobile/ 1回に留めたい
(PCとモバイル表示はは別ディレクトリなので、/mobile/をルートに戻す必要はない)

発生している問題・エラーメッセージ

マイナーなCMSがモバイルの振り分けをPHP上でやっているのですが、 こちらそのままだと、モバイルは/mobile/に行く仕組みになっていますが、 /mobile/のアドレスをスマホブラウザのメニューにある共有等から共有されると /mobile/mobile/…と閲覧URLのディレクトリがループしていきます。 サイト上のtwitterボタンでの共有ではURL正規化の設定でそれを避けられているのですが、 直接ブラウザ等から共有されると、いかんともしがたく 〈ドメイン名)/mobile/mobile/hogehoge.html 〈ドメイン名)/mobile/mobile/mobile/(以下共有数だけ繰り返し)hogehoge.htmlと URLがいくつもある状態になってしまいます。(見れることは見れる) しかもCMS販売会社ではどうにもできないといわれており、 通常ネットを見ても .htaccess でのモバイル振り分けのループ防止策しか 見当たらないので、この場合(PHP上で振り分けている場合)で ディレクトリ再ループ阻止するには何を加えればよいでしょうか。

該当のソースコード

PHP マイナーなCMSです

1 2 $regex_ua_spn = "/(iPhone|iPod|Android.*Mobile|BlackBerry)/"; 3 $viewmode = $device = (preg_match($regex_ua_spn, $_SERVER['HTTP_USER_AGENT']) != 0) ? 'mobile' : 'pc'; 4 5 if (isset($_GET['viewtype'])) { 6 $viewmode = $_GET['viewtype']; 7 setcookie("viewtype", $viewmode, null, "/"); 8 } elseif (@$_COOKIE['viewtype']) { 9 if ($_COOKIE['viewtype'] === 'mobile' && !preg_match('/mobile/', $_SERVER['REQUEST_URI'])) { 10 header("Location: /mobile" .$_SERVER['REQUEST_URI']); 11 exit; 12 } 13 } elseif ($device === 'mobile') { 14 setcookie("viewtype", "mobile", null, "/"); 15 header("Location: /mobile" .$_SERVER['REQUEST_URI']); 16 exit; 17 }

これかと思うのですが、

試したこと

基本Wordpressあたりしかいじっていないのでさっぱりどうしていいかがわかりません
助けていただければ幸いです

※モバイルだとPCアドレス(ルート)に戻してもまた/mobile/アドレスに飛ぶため、
PCサイトのURLに一旦戻して頂いても構わないです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/06/05 10:05 編集

>スマホブラウザのメニューにある共有 これって「FaceBookで共有」「LINEで共有」といったメッセージ機能のある連携アプリとの共有の件ですよね? 「URLをコピー」でも同じようになりますか? 正直なところですが、今回提示されたコードだけでは判断は難しいかもしれません。(ざっとしか見てませんが)
RaBLEbrigHomeTI

2019/06/05 10:23

すでに/mobile/ にリダイレクトされているアクセスを モバイル版のChromeなどのブラウザのメニューにある「共有」ボタンで共有した場合です。 →するとポップアップで共有方法が出ますので、「ツイート」を選択するとtwitterアプリの投稿画面が立ち上がり現在のURL …/mobile/hogehoge.htmlが入ります。 それをアクセスしてきた人は/mobile/mobile/hogehoge.html となり それをさらに共有されると…(以下繰り返し)となります。 twitterボタンはURL正規化処理で、PCのURLで共有されるようになっています。(スマホはそこでindex.php上の先程のソース文でリダレイクトされ/mobile/と1階層下がる) twitterボタンだけを利用されていれば、ループしないのですが。
guest

回答3

0

質問に記載された内容からでは、$_SERVER['REQUEST_URI'] の前に 無条件に /mobile をつけてリダイレクトしているのが悪いのではないかぐらいしか 思いつかないですね。

$_SERVER['REQUEST_URI'] の先頭に /mobile が無いことを確認してから /mobile を付加してリダイレクトさせると状況は変わりますか?

投稿2019/06/05 10:28

CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RaBLEbrigHomeTI

2019/06/05 10:34

ありがとうございます。ヒントが見つかりそうです。そういう処理にすればいいのかなと思いますがほぼ素人なので…。外注さんに確認してもらいます。
guest

0

ベストアンサー

php

1} elseif ($device === 'mobile') { 2 setcookie("viewtype", "mobile", null, "/"); 3 if (!preg_match('/mobile/', $_SERVER['REQUEST_URI'])) { 4 header("Location: /mobile" .$_SERVER['REQUEST_URI']); 5 } else { 6 header("Location: " .$_SERVER['REQUEST_URI']); 7 } 8 exit; 9}

で如何でしょう?

投稿2019/06/14 04:19

hide0128

総合スコア245

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RaBLEbrigHomeTI

2019/06/14 10:17

超解決しました。お忙しい中ありがとうございました。勉強します
guest

0

phpでアクセス中のサイトのURLを取得して変数Aに入れてのifでmobile/mobile/を変数Bに入れて一致したらmobile/にジャンプで良い気がする。

投稿2019/06/05 10:23

編集2019/06/05 10:25
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RaBLEbrigHomeTI

2019/06/05 10:25

なるほど、参考になります。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問