先に結論
PHPでfilter_varを使ってURLサニタイズをすると、アンダースコアは不正URLとして弾かれてしまうため。
代わりにピリオドなどを使うのが正しい。
経緯
WordPressを使って、リダイレクト機能の実装を行っていました。
サニタイズについて知らなかった頃、慣習としてディレクトリ名と同じカスタムホスト名を付けて、ローカル環境で使用していました。
http://example_project
この環境下であることを前提に、以下のような関数を実行します。
redirect.php
function custom_redirect_sanitize_url($rules) {
$sanitized_rules = [];
$rules = json_decode($rules, true);
foreach ($rules as $key => $value) {
if (filter_var($key, FILTER_VALIDATE_URL) === false || filter_var($value, FILTER_VALIDATE_URL) === false) {
add_settings_error(
'simple_redirect_rules',
'invalid-url',
'無効なURLです。正しいURLを入力してください。',
'error'
);
return false;
}
$sanitized_rules[$key] = $value;
}
return $sanitized_rules;
}
なお、$rules
の構造は以下のようになっています。
a:1:{s:31:"http://example_project/";s:38:"http://example_project/home";}
つまり、
"http://example_project/"
にアクセスされたら、
"http://example_project/home"
に飛ばすよ、
というだけの機能です。
しかし、何度やってもうまく行かずWordPressが不慣れだったのもあって、原因の特定に時間がかかってしまいました。
解決策
- "http://example_project/"
+ "http://example.project/"
に直した。それだけ。
デバッグ関数を使いながら原因を辿って行ったところ、
filter_var($key, FILTER_VALIDATE_URL)
において"_"(アンダースコア)が原因でURLとして認識されず、wp_optionsにリダイレクトルールが適用されていなかったのでした。
余談ですが、カスタムホスト名を修正するために変更した箇所は以下の通りです。
- apacheのhttpd-vhosts.conf
- driversのhosts
- wp-optionsのsiteurlとhome
これで無事、実装したかった機能を追加することができました!