在Wordpress中将图像设为私有

2022-08-30 20:05:36

我正在制作一个网站,我想把它设为私有。最重要的部分是,如果没有用户先登录,就无法看到域上的图像。因此,如果用户未登录,我希望所有流量都重定向到 www.DOMAINNAME.com/wp-admin(也适用于图像)。

以下是我尝试过的方法:

1)插件。我已经尝试了 两个 Wordpress 强制登录 ,插件wp-require-login即将推出的页面和维护模式

2)从这个答案添加一个函数。这是这样的:

function is_login_page() {
    return in_array( $GLOBALS['pagenow'], array( 'wp-login.php', 'wp-register.php' ) );
}

function wpse_make_blog_private() {
    if ( ! is_user_logged_in() && ! is_admin() && ! is_login_page() ) { 
    global $wp_query;
    $wp_query->set_404();
    }
}
add_action( 'wp', 'wpse_make_blog_private' );

这些东西不会重定向流量,如果我去图像的直接URL(例如 http://www.DOMAINNAME.com/uploads/2015/10/foobar.jpg)。

这能做到吗?

----------------- 编辑 1 --------------

Mevius指出,如果你输入图像的直接URL,Wordpress可能不会加载,所以他建议,它应该在apache级别上完成。

------------- 编辑结束 1 -----------


答案 1

您可以根据需要使此操作变得复杂或简单。最简单的方法是按照Hemnath Mouli的建议检查引荐来源网址,但这很容易被欺骗。

但是,如果你想深入...;)

将 .htacess 文件与 RewriteRule 结合使用,将所有映像重写为 PHP 脚本,该脚本引导 Wordpress 并检查用户的身份验证状态。此外,还应将 .htaccess 文件添加到图像文件夹中,以拒绝直接访问该文件夹以排除边缘情况。

警告:此代码只是概念证明,以帮助您入门!

.htaccess

RewriteRule ^(.*\.(jpg|gif|png))$ isAuthenticated.php?path=$1

已认证.php

require_once("wp-blog-header.php");

$allowedExtensions = array("jpg", "gif", "png");

$path = $_SERVER["DOCUMENT_ROOT"].DIRECTORY_SEPARATOR.$_REQUEST["path"];
$pathInfo = pathinfo($path);

// Check if the Wordpress user is logged in and if the file extension is allowed
// @see https://codex.wordpress.org/Function_Reference/is_user_logged_in
if (!is_user_logged_in() || !in_array($pathInfo["extension"], $allowedExtensions)) {
    header("HTTP/1.1 403 Forbidden");
    exit;
}

if(!file_exists($path)) {
    header("HTTP/1.1 404 Not Found");
    exit;
}

// Display the file and set the correct mimetype
$resource = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($resource, $path);
finfo_close($resource);

header("Content-Type: ".$mimetype);
readfile($path);

答案 2

.htaccess

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost.*$ [NC] 
RewriteRule \.(gif|jpg)$ - [F]

如果直接访问图像,则返回 403,但允许它们在现场显示。


推荐