Bảo vệ file PDF, Excel, Zip,… phải login trước khi xem trong WordPress

Trang chủ Blog WORDPRESS Bảo vệ file PDF, Excel, Zip,… phải login trước khi xem trong WordPress
Bảo vệ file PDF, Excel, Zip,… phải login trước khi xem trong WordPress

Trong quá trình làm việc với wordpress bạn sẽ gặp khá nhiều những yêu cầu, trong đó là bảo vệ file trong wordpress, bởi vì website có thể lưu những thông tin nội bộ, chỉ cho thành viên xem, tải về.

Để kiểm tra login trước khi xem hoặc tải về những tập tin, bạn hãy copy paste code dưới đây vào file .htaccess nằm ở thư mục gốc website.

RewriteCond %{REQUEST_URI} \.(pdf|xls|xlsx|xlsm|doc|docx|zip)$ [NC]
RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^wp-content/uploads/(.*)$ dl-file.php?file=$1 [QSA,L]

Lưu ý: bạn phải đặt vào dưới RewriteEngine On nhé, để sử dụng được tính năng này.

Khi gặp những link có đuôi .pdf | .xls | .doc … trên website của bạn. Apache sẽ chuyển đổi link, bằng RewriteRule tức là viết lại link.

ví dụ: link của bạn là wp-content/uploads/myfile.pdf thì Apache sẽ viết lại link mới cho bạn, wp-content/uploads/dl-file.php?file=myfile.pdf. Bạn thấy đó, bây giờ bạn cần tạo file dl-file.php.

Bạn có thể thêm hoặc bỏ bớt các loại file bạn muốn. Tiếp theo bạn hãy tạo 1 file php, đặt tên dl-file.php và đặt trong thư mục gốc website, cùng thư mục với file .htaccess. Và copy paste code phía dưới vào.

<?php
/*
 * dl-file.php
 *
 * Protect uploaded files with login.
 * 
 * @link http://wordpress.stackexchange.com/questions/37144/protect-wordpress-uploads-if-user-is-not-logged-in
 * 
 * @author hakre <http://hakre.wordpress.com/>
 * @license GPL-3.0+
 * @registry SPDX
 */

require_once('wp-load.php');

is_user_logged_in() ||  auth_redirect();

list($basedir) = array_values(array_intersect_key(wp_upload_dir(), array('basedir' => 1)))+array(NULL);

$file =  rtrim($basedir,'/').'/'.str_replace('..', '', isset($_GET[ 'file' ])?$_GET[ 'file' ]:'');
if (!$basedir || !is_file($file)) {
	status_header(404);
	die('404 &#8212; File not found.');
}

$mime = wp_check_filetype($file);
if( false === $mime[ 'type' ] && function_exists( 'mime_content_type' ) )
	$mime[ 'type' ] = mime_content_type( $file );

if( $mime[ 'type' ] )
	$mimetype = $mime[ 'type' ];
else
	$mimetype = 'image/' . substr( $file, strrpos( $file, '.' ) + 1 );

header( 'Content-Type: ' . $mimetype ); // always send this
if ( false === strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS' ) )
	header( 'Content-Length: ' . filesize( $file ) );

$last_modified = gmdate( 'D, d M Y H:i:s', filemtime( $file ) );
$etag = '"' . md5( $last_modified ) . '"';
header( "Last-Modified: $last_modified GMT" );
header( 'ETag: ' . $etag );
header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 100000000 ) . ' GMT' );

// Support for Conditional GET
$client_etag = isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) ? stripslashes( $_SERVER['HTTP_IF_NONE_MATCH'] ) : false;

if( ! isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) )
	$_SERVER['HTTP_IF_MODIFIED_SINCE'] = false;

$client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
// If string is empty, return 0. If not, attempt to parse into a timestamp
$client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0;

// Make a timestamp for our most recent modification...
$modified_timestamp = strtotime($last_modified);

if ( ( $client_last_modified && $client_etag )
	? ( ( $client_modified_timestamp >= $modified_timestamp) && ( $client_etag == $etag ) )
	: ( ( $client_modified_timestamp >= $modified_timestamp) || ( $client_etag == $etag ) )
	) {
	status_header( 304 );
	exit;
}

// If we made it this far, just serve the file
readfile( $file );

Chúc bạn thành công!