validationのactive-urlはドメインチェックだけをする
validationをかけるときに
active-urlだからとなにも考えず
引数にURLをつかってしまうとvalid出来ずにハマる。
リファレンスにもそう書いてあるし!!!
active_url
フィルドがPHPの機能であるcheckdnsrr
を通して、有効なURLであるかをバリデートします。
http://readouble.com/laravel/4/2/0/ja/validation.html#rule-active-url
checkdnsrr…だ、と。
実際に使ってみた
検証用コード
// validation設定
$rule = ['url' => 'active_url'];
$input = ['url' => $url];
$validator = Validator::make($input, $rule);
//生きたURLかチェック
if ($validator->fails()) {
echo '\inactive URL/';
} else{
echo '\active URL/';
}
検証① http://allabout.co.jp
結果:\active URL/
検証② http://yahoo.co.jp
結果:\inactive URL/
検証③ http://allabout.co.jp/gm/gc/447800/
結果:\inactive URL/
実際はactiveなURLなんですけどね(・ω・`)
Laravel内の実装
validationで使われる関数 validateActiveUrl
/**
* Validate that an attribute is an active URL.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
protected function validateActiveUrl($attribute, $value)
{
$url = str_replace(array('http://', 'https://', 'ftp://'), '', strtolower($value));
return checkdnsrr($url);
}
Checkdnsrr とは
bool checkdnsrr ( string $host [, string $type = "MX" ] )
host に対応する type 型のレコードを DNS から探します。
http://php.net/manual/ja/function.checkdnsrr.php
つまり…
上手くいく
http://allabout.co.jp
→checkdnsrr('allabout.co.jp')
true!!!
意図した結果にならない
http://allabout.co.jp/gm/gc/447800
→checkdnsrr('allabout.co.jp/gm/gc/447800')
false!!
所感
- リファレンスはちゃんと読もう
- active-urlって書いてあるけどURLを素直に引き渡してはいけない