我在我的网站上构建了一个功能,我只想允许某些人能够从我的上传文件夹下载或访问某些 pdf。
在互联网上搜索,我找到了很多答案,并且非常接近解决我的问题。
我构建pdf的方式在里面。
[root]/wp-content/uploads/scopes/unlocked-scopes/<filename>.pdf
我有兴趣通过如下 PHP 脚本路由对这些文件的所有请求。
<?php
require_once($_SERVER['DOCUMENT_ROOT'].'wp-load.php');
function manage_action()
{
$page = get_permalink( get_page_by_path( '404-not-found' ) );
if($page) {
wp_redirect( $page );
exit();
} else {
wp_redirect(home_url());
exit();
}
}
// Bail if request paramter doesn't exist.
if(!isset($_GET['request'])) {
manage_action();
}
// check if someone is logged in or not.
if( !(current_user_can('author') || current_user_can('administrator')) ) {
manage_action();
}
// Get Scope
$scope_exists = get_posts( array(
'post_type' => 'project_scope',
'p' => $_GET['request'],
'numberposts' => 1,
));
// Bail if scope doesn't exists.
if(empty($scope_exists)) {
manage_action();
}
$scope = $scope_exists[0];
$author = $scope->post_author;
$user = get_current_user_id();
if(!current_user_can('administrator') && ($user != $author)) {
manage_action();
}
$file = wp_upload_dir()['basedir'] .'/scopes/unlocked-scopes/'.$_GET["file"];
if(substr($file, -1) == '/') {
$file = substr($file, 0, -1);
}
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
最初,我在 Windows 机器上使用 Laragon 设置并使用 Apache 服务器在本地机器上构建了这个限制。
我在根目录下的 .htaccess 文件中添加了以下内容。
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_FILENAME} (unlocked-scopes.*)
RewriteRule ^wp-content/uploads/scopes/unlocked-scopes/(.*)$ wp-content/uploads/dl-file.php?file=$1 [QSA,L]
</IfModule>
这在 apache 本地服务器上工作得非常好,但我的实时服务器正在使用openlitespeed
数字海洋水滴上的服务器,它根本不起作用。
我在 wordpress 规则之前添加了这条规则。
更新当我尝试从unlocked-scopes
我的实时服务器中的文件夹中访问任何 pdf 文件时,它会打开而不会点击我的 php 脚本,这使得它可以公开访问。使用 openlitespeed 时是否还需要添加其他内容.htaccess
?