web-dev-qa-db-ja.com

Download_urlを使用するときに.htaccessをバイパスする

私はアップロードと呼ばれるクライアントの私のカスタムディレクトリに次の.htaccessファイルを持っています。

RewriteEngine On
RewriteCond %{HTTP_REFERER} !(www.)?example.co.uk/client-area*
RewriteRule ^.*$ - [R=403,L]
ErrorDocument 403 'http://www.example.co.uk/client-area/'

そのため、誰かがクライアントエリアページ以外の場所からuploads/client /ディレクトリ内のファイルにアクセスしようとすると、リダイレクトされます。

ただし、download_urlを使用してそのディレクトリ内のファイルにアクセスするときは、これを無視したいです。これを容易にするために使用できる書き換え条件はありますか?

3
SinisterBeard

pre_http_requestをフィルタリングすることで、WordPressのHTTPリクエストに構成済みのリファラーを挿入できます。あなたが必要とするのはこのような単純なクラスだけです(未テスト!):

class FakeWpReferer
{
    private $referer;

    private $url;

    private $is_regex;

    /**
     * @param string $referer
     * @param string $url URL to fake the referer for.
     * @param bool   $is_regex Is $url a regular expression?
     */
    public function __construct( $referer, $url, $is_regex = FALSE )
    {
        $this->referer  = $referer;
        $this->url      = $url;
        $this->is_regex = $is_regex;
    }

    /**
     * @wp-hook pre_http_request
     * @param   array $args
     *
     * @return array
     */
    public function inject( array $args, $url )
    {
        if ( $this->match_url( $url ) )
            $args['headers']['Referer'] = $this->referer;

        return $args;
    }

    /**
     * @param string $request_url
     *
     * @return bool
     */
    private function match_url( $request_url )
    {
        if ( ! $this->is_regex )
            return $request_url === $this->url;

        return (bool) preg_match( $this->url, $request_url );
    }
}

そしてそれをフィルタとして登録します。

$fake = new FakeWpReferer(
    'http://example.co.uk/client-area',
    '~^http://www.example.co.uk/uploads/~',
    TRUE
);
add_filter( 'pre_http_request', [ $fake, 'inject' ], 10, 2 );

それからdownload_url()を使うことができ、WordPressはあなたのカスタムリファラーを使います。他の誰もがリファラーを偽造することができることに注意してください。ですから、あなたの「保護」は実際にはそうではありません。

1
fuxia