0

我在我的网站上构建了一个功能,我只想允许某些人能够从我的上传文件夹下载或访问某些 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

4

1 回答 1

0

我能够找到有关将重写规则从 apache 迁移到 openlitespeed 服务器的文档。

文章

在文档部分“从 Apache Document Root .htaccess 迁移到 OpenLiteSpeed Vhost Rewrite Tab ”中,据说,

RewriteRule ^adminPages/(.*)$ admin-panel/$1 [L]

更改为

RewriteRule ^/?adminPages/(.*)$ admin-panel/$1 [L]

这个。

而且我必须将它添加到 OpenLiteSpeed(Web 管理面板)> VirtualHost > Edit your host > Rewrite 选项卡中。

默认的 Webadmin 面板位于7080端口。

我的最终重写规则是。

<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>

我将它添加到重写选项卡中。

在此处输入图像描述

于 2021-09-08T17:52:13.827 回答