PHPでは、 Parse_URLは、Scheme、Host、Port、Path、クエリなどのコンポーネントを分割するために使用される一般的な関数です。この機能は日常開発で非常に実用的ですが、URLにIPv6アドレスが含まれている場合、その動作はわずかに複雑になります。この記事では、IPv6アドレスを含むURLを扱う際のParse_urlの動作と予防策を調べます。
RFC 3986によると、URLのホスト部分がIPv6アドレスである場合、正方形の括弧で包む必要があります。例えば:
http://[2001:db8::1]:8080/path?query=1
四角い括弧の目的は、ポート番号のコロンから分離し、曖昧さを解析することを避けることです。
phpのparse_url関数の構文は次のとおりです。
parse_url(string $url, int $component = -1): array|string|false
IPv6アドレスを含むURLを渡すとき、 Parse_urlはホスト部品を正しく識別して抽出できます。特定の例を見てみましょう。
$url = 'http://[2001:db8::1]:8080/path?query=1';
$parts = parse_url($url);
print_r($parts);
出力の結果は次のとおりです。
Array
(
[scheme] => http
[host] => 2001:db8::1
[port] => 8080
[path] => /path
[query] => query=1
)
ご覧のとおり、元のURLのIPv6アドレスでは正方形の括弧が使用されていますが、 Parse_urlは戻り結果の正方形の括弧を削除し、純粋なアドレス部分のみが残ります。これは期待に合った行動です。
IPv6アドレスがURLの正方形の括弧内に正しくラップされていない場合、 parse_urlは正しく解析されません。例えば:
$url = 'http://2001:db8::1:8080/path';
$parts = parse_url($url);
Parse_urlが2001年:DB8 :: 1:8080がホストまたはホストプラスポートであるかどうかを判断できないため、このコードはFalseを返します。これにより、構文のあいまいさが生じます。
Parse_urlは、IPv6アドレスを四角い括弧で包む必要がある場合、IPv6アドレスを含む解析URLをサポートします[] 。
リターン結果のホストフィールドには、正方形の括弧が含まれていません。
IPv6アドレスが正方形のブラケットに包まれていない場合、 parse_urlは解析に失敗し、 falseを返します。
この関数はほとんどの標準的なURLに適用されますが、URLの妥当性検証を実行しません(たとえば、IPアドレスが合法であることを確認しません)。
Parse_URLを使用してURLを処理する場合(特にIPv6アドレスが含まれるシナリオで)、入力URLがRFC標準、特にホスト部品の正しい形式に従うことを確認してください。ユーザーが入力したURLである場合、 Parse_urlを呼び出す前に形式を前処理して検証して、解析の障害やセキュリティの問題を避けることをお勧めします。