前提
ユーザーがブラウザ検索バーに入力した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 = 'ルパン三世(';
試したこと
我ながらアホな方法だと思いますが、
- まずあらゆるアクセスに対しphpは何も返さず
- JavaScriptで ホスト(
http://example.com
)とパス(/episode/ルパン三世(#3)
)をPOSTし - このPOSTされた値を用いて、phpで URL を
define
し - 該当のソースコード のように
$sql
を生成する
という流れならできることがわかりましたが、こんな方法が良いとはとても思えません。
Twitterの場合
ちなみにTwitterでは、サイト内検索バーに "#りんご" と入れると、ブラウザ検索バーは次のようになりますが、
https://twitter.com/search?q=%23りんご
ブラウザ検索バーに "https://twitter.com/search?q=#りんご" と入力すると、ブラウザ検索バーは次のようになりリダイレクトされました。
https://twitter.com/explore
つまり「 "#" で中断される問題」は諦めているようでした。
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/04/21 07:47