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

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

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

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

PHP

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

Q&A

解決済

5回答

857閲覧

URLのパスに "#" があり、それをブラウザ検索バーに入力された場合、phpで "#" 以降がパスの一部であることをどのように判別しますか?

nikuatsu

総合スコア177

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

PHP

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

0グッド

1クリップ

投稿2022/04/21 07:26

編集2022/04/21 07:33

前提

ユーザーがブラウザ検索バーに入力したURLについての話です。

例えば URLのパスに "ルパン三世(#3)" がある場合は、
http://example.com/episode/ルパン三世(#3)

phpの$_SERVERでは "#" で中断されてしまいます。
http://example.com/episode/ルパン三世(

実現したいこと

この「$_SERVERが "#" で中断される問題」を回避したいです。

(尚 "#" に限らず "?" 等でも中断が生じますのでこれも回避したいのですが、以下 "#" の例で進めさせて頂きます。)

発生している問題

以下 該当のソースコード の流れで、アクセスされたURLをdefineした上で色々な関数で使いまわしていますので、この中断がネックとなっています。

中断により、"ルパン三世(#3)" を取得できないという問題です。

該当のソースコード

次のようにアクセスされたURLをdefineしており、

php

1$access_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 2define( 'URL', $access_url );

次のようにSQL文を生成しても、

php

1/* 2定数 URL には以下のように "#" で中断された値が入っている 3"http://example.com/episode/%E3%83%AB%E3%83%91%E3%83%B3%E4%B8%89%E4%B8%96(" 4*/ 5$parse = parse_url(URL); 6$path = urldecode($parse['path']); 7$episode_name = explode('/',$path)[2]; 8$sql = "select * from titles where title = '{$episode_name}';";

次のように "ルパン三世(#3)" があるSQL文は生成できず、中断されたSQL文が生成されてしまいます。

SQL

1-- これは生成できず 2select * from titles where title = 'ルパン三世(#3)'; 3 4-- これが生成されてしまう 5select * from titles where title = 'ルパン三世(';

試したこと

我ながらアホな方法だと思いますが、

  1. まずあらゆるアクセスに対しphpは何も返さず
  2. JavaScriptで ホスト(http://example.com)とパス(/episode/ルパン三世(#3))をPOSTし
  3. このPOSTされた値を用いて、phpで URL を define
  4. 該当のソースコード のように $sql を生成する

という流れならできることがわかりましたが、こんな方法が良いとはとても思えません。

Twitterの場合

ちなみにTwitterでは、サイト内検索バーに "#りんご" と入れると、ブラウザ検索バーは次のようになりますが、
https://twitter.com/search?q=%23りんご

ブラウザ検索バーに "https://twitter.com/search?q=#りんご" と入力すると、ブラウザ検索バーは次のようになりリダイレクトされました。
https://twitter.com/explore

つまり「 "#" で中断される問題」は諦めているようでした。

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

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

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

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

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

guest

回答5

0

URLの#以降はフラグメント(ページ内の位置を示す)というもので、ブラウザ内で処理され、サーバーには送信されません。
http://example.com/episode/ルパン三世(#3)というURLをブラウザに入力すると、example.comというサーバーに対して、GET /episode/ルパン三世( HTTP/1.1というリクエストが送信されます。
で、返ってきたHTMLページに3)と言う名前のページ内リンクを探して、あれば、そこまでスクロールします。

URLの中で#を「フラグメントの開始」以外の意味で使いたい時は、%23と書きます。
http://example.com/episode/ルパン三世(%233)

投稿2022/04/21 07:39

otn

総合スコア84533

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

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

nikuatsu

2022/04/21 07:47

ありがとうございます。Twitterの場合のようにするしかないということですね。つまりaタグのクリックや検索バーへの入力の際は%23へエンコードし、ブラウザ検索バ―への直入力の場合は適当なところへリダクレトさせる。という方法ですね。
guest

0

前回ので納得いってないなということですね?
URLにおける#は特別な意味を持つので、直接書くとそれ以降の文字はサーバー側に送られません

投稿2022/04/21 07:34

yambejp

総合スコア114825

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

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

nikuatsu

2022/04/21 07:41

> 前回ので納得いってないなということですね? あ、いえいえ。前回はaタグのクリックの場合です。あれはJavaScriptでパーセントエンコードができるので納得致しました。ありがとうございました。 今回はブラウザ検索バーに直入力された場合です。これはパーセントエンコードができず$_SERVERでなんとかしなければならず、新たな問題とさせて頂きました。(納得はいっても理解が浅かったのだろうと言われてしまうかもしれませんが) > 直接書くとそれ以降の文字はサーバー側に送られません これは…つまり諦めるしかないということでしょうか?つまりaタグのクリックの場合は自前でパーセントエンコードし、ブラウウザ検索バーに直入力された場合はTwitterのようにリダイレクトする。という対処法しかないということでしょうか?
yambejp

2022/04/21 07:46

> > 直接書くとそれ以降の文字はサーバー側に送られません > これは…つまり諦めるしかないということでしょうか? そうです。諦めるしかないです。 この辺HTMLの基本中の基本なので理解しておいてください
nikuatsu

2022/04/21 07:48

なるほどです。踏ん切りがつきました。度々ありがとうございます。
guest

0

サーバーサイドでは#以降は取得できない。言語もブラウザも関係なくそういう仕様。

URLに含める時はURLエンコードして使う。
https://twitter.com/search?q=%23りんごはブラウザ(Chrome)では%23りんごで見えてるかもしれないけど正確には違う。
#りんごを全部エンコードしている。
https://twitter.com/search?q=%23%E3%82%8A%E3%82%93%E3%81%94
PHPならrawurlencode()かurlencode()

php

1'https://twitter.com/search?q='.rawurlencode('#りんご')

投稿2022/04/21 07:48

kawax

総合スコア10377

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

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

nikuatsu

2022/04/21 07:53

ありがとうございます。明確にできないのだと知れて良かったです。
guest

0

ベストアンサー

そもそもアドレスバーに直接入力=サービスの機能を介していないのでサポート外
と考えるのが妥当では。諦めている云々はかなりの曲解に思います。

投稿2022/04/21 07:37

m.ts10806

総合スコア80850

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

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

nikuatsu

2022/04/21 07:54 編集

サポート外とは、なるほど。そう考えるなら諦めるのとかそういう問題ではなかったのですね。ありがとうございます。
m.ts10806

2022/04/21 07:48 編集

どこまで想定するかはサービス提供側が決めることですが、 字数制限はあるにしても完全自由入力できる場所に対して全て拾うのは不可能です。
nikuatsu

2022/04/21 07:51

たしかにそうですもんね。諦めたくないと思っていたのですが、サポート外という表現に腹落ちしました。ありがとうございました。
guest

0

Javascript で location.hash にて "3)" が取れると思いますので、それがおかしな値なら再リクエストしてみるとか?
"#" 以降にゴミが入っている、途中で切れているというケースはよくあるので、それがよい結果につながるかは疑問ではありますが。

世の中的には、商品などの特定はコードで行い、SEO 的にどうしても商品名を付けたいならあってもなくても挙動が変わらないようにする、のが一般的かと思います。
例: https://www.amazon.co.jp/商品名/dp/コード/ でも https://www.amazon.co.jp/dp/コード/ でも同じ

あるいは URL は http://example.com/episode/ルパン三世(__0x23__3) などと独自置換したものにしておくというのもありかもしれません。

投稿2022/04/22 07:58

68user

総合スコア2005

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問