URLクエリパラメータ(クエリストリング)のリダイレクト設定について

解決済
Snufkin
遊覧客
17 0 3

新参者です。

的外れな質問になるかも知れませんが、ご教授いただければ幸いです。

※Shopifyサポートに問合せましたが、技術的なことには回答できないとのことでしたので「技術的なQ&A」に投稿しました。

 

下記の設定項目で、「リダイレクト元」に、ある形式のURLクエリパラメータ(クエリストリング)を設定すると
リダイレクトできません。どのような値を入力すればリダイレクトが実現可能であるかご教授ください。

【設定画面】
ストア管理/オンラインストア/メニュー/URLリダイレクト/URLリダイレクトを作成

【設定項目】
・リダイレクト元 ← ココ
・リダイレクト先

 

【入力例】

「リダイレクト元」に

/?pid=12345 と 値を入れて「保存する」を実行すると

?pid=12345 という値に自動変換されて登録されます。

 

「リダイレクト先」には

/products/12345 と 値を入れて「保存する」を実行すると

/products/12345 そのままの値が登録されます。

 


上記の内容で設定した場合にリダイレクトは実行されませんでした。

 

推測されるリダイレクトされない原因は、例えばブックマーク等で旧URL

...//hoge.com/?pid=12345 にアクセスしたとします。

しかし、Shopifyのリダイレクト設定でのリダイレクト元は

...//hoge.com?pid=12345

/ なしの形式で待っているようで、ミスマッチとなりリダイレクトが実行されていないようです。

尚、システムの移行は、ドメインの変更はなし(同一ドメイン)で、旧URLはリンク切れ(404 Not Found)の状態になってます。



単純な文字列比較を行ってマッチングを行っているようで、URLエンコード(\)やワイルドカードなど試しましたが
リダイレクトを実現できませんでした。

どのような形式で「リダイレクト元」を設定すればよいのか?または、これを解決するアプリなど
ご存知でしたらご教授いただければと考えております。

 


以上、宜しくお願い致します

0 件の「いいね!」
Tomoyuki_K
遊覧客
20 7 23

リダイレクト元の入力欄にある説明で、

訪問者を転送したい元のURLです。通常、これは、コンテンツが別のURLに移動されたか削除されたため、訪問者がアクセスできなくなった古いページです。

とあるので試して見たところ、リダイレクト元は存在しないページではないと動かないようでした。
つまり、実際そのページにアクセスして404になるページしか、リダイレクト元に設定できないようです。

/?p=12345 というパスはトップページなので、トップページを404にする方法は、オンラインストアを利用しないプラン(shopify light)にすることだと思うのですが、
そもそもこのリダイレクト機能自体、オンラインストアの機能なので、プラン変えると、リダイレクト自体無効化されると思います。

つまり、オンラインストアのリダイレクト機能でトップページをリダイレクトするとのは(クエリがあっても)無理なのではないでしょうか :汗をかいた笑顔:

 

アプリを使った代替方法は、申し訳ないですが、ちょっと検討がつかないです 🙇

Snufkin
遊覧客
17 0 3

 

 

 

なので、設定画面での保存時に、URLクエリパラメータの書式のみ明示的に、先頭「/」を消去する

書式変換処理(マッチングしない文字列に変換)を行うようにしている

 

そういう仕様ということで認識あってますか?

 

何の意図があって、URLクエリパラメータのリダイレクト機能がそういう処理をしているのか

何故、オフィシャルサイトに上記の仕様が明記されてないのか気にはなりますが、

/? で始まる文字列を登録できないのであればどうにもなりません。

 

 

しばらく、1週間ほど他のレスポンスも待ってみます。

それで何も進展がないようでしたら、ベストソリューションとさせていただきます。

 

以上、宜しくお願い致します

 

 

 

0 件の「いいね!」
junichiokamura
Community Manager
Community Manager
935 209 348

すいません、

なるほど、旧URLである.../hoge.com/?pid=12345のURLクエリパラメータの書式に限って、ShopifyではTOPページを指す書式であり

ここでおっしゃってる旧URLとは、 ドメインを変更されたということですか?

そもそもこの設定は、相対パスでしかできないので、現状のShopifyストア内でのリダイレクトのみ有効です。

そしてShopifyのURL構成は全てパスで表現されて、クエリパラメータは使っていないので、リダイレクトの設定にクエリパラメータは不要かと思います。

また、クエリパラメータをのぞいて、「/」 で登録しようとするとエラーとなりますが、これは現状のストアのTOPが存在せず、かつそれを現状のストアのどこかにリダイレクトすることになり、矛盾するからだと思います。

なお、/?pid=12345 も、?pid=12345 もアクセスするURLとしては同様に処理されますので、「/」が消されることは直接事象とは関係ないと思われます。

上記の方がおっしゃるように、設定画面に、削除されたページのみリダイレクトすると書いてあるので、単純にTOPは存在しているのでリダイレクトされないのだと思います。

(そういう意味で、クエリパラメータのみの設定も本来エラーとして設定できない方が良い気もしますが。。)

 

 

Technical Partner Manager, Japan
Snufkin
遊覧客
17 0 3

 

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

 

>> なるほど、旧URLである.../hoge.com/?pid=12345のURLクエリパラメータの書式に限って、ShopifyではTOPページを指す書式であり
> ここでおっしゃってる旧URLとは、 ドメインを変更されたということですか?

 

  いいえ、ドメインは変更しておりません。(既にDNSでドメインはShopifyへ向けられ関連付けされてます)
  他のECからShopifyへシステムを移行した場合の質問で、URLで変わるのはドメインより下方の文字列になります。
   例)
    旧商品URL ..://hoge.com/?pid=1234
    新商品URL ..://hoge.com/products/1234

  また、Shopifyがクエリパラメータ形式を採用していないことは承知しております。

 

> なお、/?pid=12345 も、?pid=12345 もアクセスするURLとしては同様に処理されますので、「/」が消されることは直接事象とは関係ないと思われます。

 

  もし同様に解釈されるのであれば、「?pid=1234」の設定でリダイレクトできているかと思います。
  ブラウザは自動的に「?」の前に「/」を追加補完し表現はしますが、Shopifyのリダイレクトは、あくまで「?pid=1234」という文字列で比較しているものと考えられます。

  というのもですね、QAにあげる前に行った検証では

  「?pid=1234」から「?」を抜いて「「/pid=1234」」と登録すると「..://hoge.com/pid=1234」でアクセスしてリダイレクトされます。
  他に「?」を「&」などに変えても「..://hoge.com/&pid=1234」でアクセスしてリダイレクトされます。

  でしたので、皆さまからご教授しただいている
  TOPページや相対パスなどのシステムの作用はうけておらず単純に文字列を比較しているものと解釈しております。

  また、適当なURL
   例) .://hoge.com/&&&&hogehogehoge
  などでも、リダイレクト元に「/&&&&hogehogehoge」と記述すれば、元々あったURLか否かも関係なく
  同一ドメイン上で存在しないURLはリダイレクトされます。


  上記のことから、私が知りたいことは

   なぜ、「/?」から始まるURLクエリパラメータの書式に限って「/」を登録後に削除する挙動をするのか?
   挙動の理由は不明であれ、「/?」から始まるURLクエリパラメータの書式とイコールとなる入力表現方法はないのか?

  となります。

  これはいたずらなのでしょうか??。。。それともよほどの理由でもあるのでしょうか。。
  またまた長文になり申し訳ありません。


以上、宜しくお願い致します

0 件の「いいね!」
junichiokamura
Community Manager
Community Manager
935 209 348

詳細を共有いただきありがとうございます。

内容は理解いたしました。

「?pid=1234」から「?」を抜いて「「/pid=1234」」と登録すると「..://hoge.com/pid=1234」でアクセスしてリダイレクトされます。
>  他に「?」を「&」などに変えても「..://hoge.com/&pid=1234」でアクセスしてリダイレクトされます。

HTMLの仕様上、最初の? を抜かすして / を入れるとそれ以降パスとみなされるので、この状況でリダイレクトされるのは、

>また、適当なURL
> 例) .://hoge.com/&&&&hogehogehoge
> などでも、リダイレクト元に「/&&&&hogehogehoge」と記述すれば、元々あったURLか否かも関係なく
> 同一ドメイン上で存在しないURLはリダイレクトされます。

こちらの状況と全く同じですので、不思議な点はないかと思います。

試しに、登録なしで

hoge.com/pid=1234 や、 hoge.com/&pid=1234 にアクセスすると 404 となります。

ですので、

 ブラウザは自動的に「?」の前に「/」を追加補完し表現はしますが、Shopifyのリダイレクトは、あくまで「?pid=1234」という文字列で比較しているものと考えられます。

こちらは誤りで、

> なぜ、「/?」から始まるURLクエリパラメータの書式に限って「/」を登録後に削除する挙動をするのか?

/ を入れても入れなくても、 HTTPの正しい規約(RFCの正しい仕様は、そのURLが一意の場所を示す場合、最後のスラッシュは入れないので(入れるとディレクトリを指しますので、その後にファイル名が続くことを期待されます。))に対応するために、Shopifyが変換しているのだと思います。

普通のレンタルサーバーなどでは、ROOT配下に、index.htmlなどを置くため、 /  ->  /index.html に補完されて表示されますが、Shopifyはクラウドサービスですので、基本的に、/ で終わるURLを提供するのは本来、HTTPの仕様上は間違っております。

以下にご説明があるので、ご参考ください。
https://pr.toriaez.jp/navi/column/404.html

ですので、ご共有いただいている挙動は特に不思議な点はない認識です。

ただし、移行前の元のショップが、/?pid=1234 で特定商品を表していて、それをShopify移行後のリダイレクトに設定できない不便さは理解いたします。。

(前述の通り、hoge.com/?pid=1234 というのは、厳密にはURLの記述としては間違いなので、元々のサイトが、 hoge.com?pid=1234 か、hoge.com/index.html?pid=12334であれば問題なかったと申し上げるしかないのですが。。)

Technical Partner Manager, Japan
junichiokamura
Community Manager
Community Manager
935 209 348

すいません、

> hoge.com?pid=1234 か、hoge.com/index.html?pid=12334であれば問題なかったと申し上げるしかないのですが。。

hoge.com?pid=1234 だと、404にならないので、hoge.com/index.html?pid=12334 (またはそれに準じるトップファイルの記述)しか有効でないですね。。

Technical Partner Manager, Japan
jizo
先駆者
231 81 261

成功

本筋とずれるかもしれませんので不要なら無視していただきたいのですが、どうやってリダイレクトするかという点の案が作れそうでしたので一応記載したいと思います。

 

骨子は以下の通りです

  • hoge.com/?pid=12345がTOPページとして扱われるなら、TOPページにJSを書いて動作させられる
  • TOPページにのみJSのコードを記載して、JSリダイレクトを実行する

 

該当のコードは以下のものですが、テストできていない上かなり適当なので自信はありません。

スタイルシートやDOMの読み込みを待つ必要はないため早い段階でJSが即実行できればよく、想定している記載箇所はheadの上の方です。

 

 

 

<script>
function getParam(name, url) {
  if (!url) url = window.location.href;
  name = name.replace(/[\[\]]/g, "\\$&");
  var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
      results = regex.exec(url);
  if (!results) return null;
  if (!results[2]) return null;
  return decodeURIComponent(results[2].replace(/\+/g, " "));
}
function redirect(){
  var pid = getParam('pid');
  if( pid != null ){
    location.href= "https://example.com/products/" + pid;
  }
}
redirect();
</script>

 

 

 

参考URL:

http://www-creators.com/archives/4463

 

意図している動作は以下の通りです。

  1. ページアクセス時の早い段階で関数のredirect()を実行
  2. getParam()でパラメータの内のpidの値を取得
  3. pidの値が取れていれば、location.hrefでリダイレクト

 

懸念点は以下の通りです。

  • リダイレクト先がpidの値と無関係の場合は、全てのリダイレクトパターンを記載しなければならない
  • JSによるリダイレクトのデメリット(詳細は検索していただければと思います)

 

未検証かつ無理やりでバッドノウハウな案と言えますので、Shopifyで実際に動いたとしてもお勧めしがたいのですが、最悪JSでどうにかできなくもないかもしれません。

Snufkin
遊覧客
17 0 3

 

 

通常の.htaccessファイルに記述するリダイレクト処理と同様に文字列の比較

をしているものだという固定観念もありました。

 

 

であれば、登録時に「/」以降を全て消すか何らかの警告は欲しいものです。

または、仕様に明記していただきたいですね。

 

SaaSの利点も多々ありますが、.htaccessで数行の記述で済む処理なので

このパターンは網羅しておいていただきたいところでした。

 

理由を追求しても仕様で明記されていないので、この辺でクローズしたいと思います。

動作に関しましても、管理画面のカスタマイズは不可ですので仕様が網羅する方向に動くまで

挙動に従う他ないと認識します。

 

ご親切に新参者にお付き合いいただきました皆さまに感謝いたします。

ありがとうございました。

 

 

以上、宜しくお願い致します

0 件の「いいね!」
Snufkin
遊覧客
17 0 3

 

 

 

仰ぎたいと考えております。

 

結果がで次第、投稿いたします。

 

 

以上、宜しくお願い致します

0 件の「いいね!」