0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

カスタムホスト名に" _ "(アンダースコア)を使わないようにしている理由

Posted at

先に結論

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

これで無事、実装したかった機能を追加することができました!

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?