基本的な方法 (active_url)
Laravelのバリデーションルールにはactive_url
というルールがあります。
URLが実際に存在し、インターネット上でアクセス可能かどうかをチェックできます。
例
class TestRequest extends BaseFormRequest
{
public function rules()
{
return [
'url' => ['required', 'active_url'],
];
}
}
active_url
は、URLがDNS上で解決可能なものであるかどうかをチェックします。つまり、URLのドメイン名が実際に存在し、DNSによってIPアドレスに解決できるかどうかを確認します。
URLが形式的に正しい(つまり、有効なドメインを含む)ことを保証するために使用されますが、そのURLがHTTPステータスコード200であるかどうかは確認しません。
もしURLが404エラーを返す場合でも、active_url
はこれを「無効」とはみなしません。
DNSチェックが通過する限り(つまり、ドメインが存在し、DNSクエリがIPアドレスを返す限り)、URLは「有効」と見なされるためです。
アクセス可能かつHTTPコードが200かどうかまで調べたいとき
カスタムバリデーションルールを作成し、cURLやGuzzleなどのHTTPクライアントを使用してURLにHTTPリクエストを送り、レスポンスをチェックする方法が考えられます。
例えば、以下のようなカスタムバリデーションで対応できます。
Validator::extend('url_accessible', function ($attribute, $value, $parameters, $validator) {
try {
$response = Http::head($value);
return $response->successful();
} catch (\Exception $e) {
return false;
}
}, 'The URL is not accessible.');
Httpファサードを使用して指定されたURLがアクセス可能かどうかをチェックしています。
このルールは、URLがHTTPレスポンス(ステータスコード200系)を返すかどうかをチェックします。これにより、実際にページが存在するかどうかをより確実に判断できます。
ぜひ参考にしていただけると幸いです。