例如,我的主域p
是一个文件共享网站,我们将文件保留在cat <<EOF |
START This is a
sample paragraph that has special characters like new lines
spaces, tabs, quotes "abc", equals =, angular brackets <abc>, front slash / and might contain the starting string that should be ignored
START and
END
START
dfgfah
END
EOF
sed -n '
:head
/^START/{
:start
n
$q
/^END/{
s/^/START New text /
p
n
:tail
p
$q
n
b tail
}
b start
}
p
$q
n
b head
'
和www.example.com
之类的子域中,以与访问者共享。我的问题是如何直接保护子域(子域可能指向不同的服务器或主机)上的文件,而无需在wordpress / mainsite中进行身份验证即可下载。
我当前的代码功劳归于server1.example.com
.htaccess文件
server2.example.com
所以我的整个.htaccess代码看起来像
http://wordpress.stackexchange.com/a/37743/12438
但它只能保护RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^wp-content/uploads/(.*)$ dl-file.php?file=$1 [QSA,L]
中的文件
这是# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# BEGIN THIS DL-FILE.PHP ADDITION
RewriteCond %{REQUEST_URI} ^.*wp-content/uploads/.*
RewriteRule ^wp-content/uploads/(.*)$ dl-file.php?file=$1 [QSA,L]
# END THIS DL-FILE.PHP ADDITION
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Options -Indexes
wp-content/uploads/*
答案 0 :(得分:1)
将受保护的文件放在网站的公共访问区域之外的私有文件夹中。然后,制作一个下载页面,该页面在url或其他内容中带有文件名。然后在该页面上,进行身份验证检查:
is_user_logged_in() || auth_redirect();
// open file
// send headers
// echo contents
答案 1 :(得分:1)
第1步:
将以下内容添加到所有子域的'.htaccess'。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s
RewriteCond %{QUERY_STRING} !key=(FgTyUeL)
RewriteRule ^(.*)$ http://www.example.com/?dwnld_file=server1/$1 [QSA,L]
在上面的代码中,我们将所有文件重定向到主域,除非设置了 post 参数。例如,http://server1.example.com/file.pdf
将被重定向到http://www.example.com/?dwnld_file=server1/file.pdf
。这里server1
是您的子域名,以便确定是否有多个子域。
在重写条件下-RewriteCond %{QUERY_STRING} !key=(FgTyUeL)
,key
及其值FgTyUeL
应该是机密的,可以随时更改为更复杂的字符串。我们将使用它来访问WordPress中的文件。
第2步:
将它们添加到您的主题的主域的“ functions.php”中。
/* init hook to check whether user logged-in and pass to download function */
add_action( 'init', 'file_init' );
function file_init() {
if ($_REQUEST[ 'dwnld_file' ] != '') {
if ( ! is_user_logged_in() ) { // if not logged-in
auth_redirect(); //redirect to login page
// wp_redirect( 'http://www.example.com/login' ); // or some other page
exit;
}
else {
$spliturl = explode("/",$_REQUEST[ 'dwnld_file' ]);
$originalurl = "http://".$spliturl[0].".example.com/".substr($_REQUEST[ 'dwnld_file' ], strpos($_REQUEST[ 'dwnld_file' ], "/") + 1);
check_download_file( $originalurl ); // if logged-in pass file to download
}
}
}
/* function to download file */
function check_download_file( $url ) {
$key='?key=FgTyUeL'; // secure post key same as .htaccess
$file = basename($url);
$mime = wp_check_filetype( $file );
if( false === $mime[ 'type' ] && function_exists( 'mime_content_type' ) )
$mime[ 'type' ] = mime_content_type( $file );
if( $mime[ 'type' ] )
{
set_time_limit(0);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url.$key);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$curl_response = curl_exec($ch);
curl_close($ch);
header('Expires: 0'); // no cache
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT');
header('Cache-Control: private', false);
header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename="' . basename($url) . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . strlen($curl_response)); // provide file size
header('Connection: close');
echo $curl_response;
die();
}
}
以上功能是不言自明的-我们正在检查WordPress身份验证,如果已登录用户,我们将附加安全密钥并使用cURL下载文件。请注意,该安全密钥应与您的子域的“ .htaccess”文件中的安全密钥相同。
如果文件位于子域的任何文件夹中,甚至位于不同的域中,上述逻辑也将起作用(但应该可公开访问)。