在 Wordpress 中将图像设为私有

Posted

技术标签:

【中文标题】在 Wordpress 中将图像设为私有【英文标题】:Make images private in Wordpress 【发布时间】:2016-01-02 11:38:24 【问题描述】:

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

这是我尝试过的:

1) 插件。我试过Wordpress Force Login,插件wp-require-login和Coming soon page and Maintenance mode。

2) 从this answer 添加一个函数。这是什么:

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 级别上完成。

------------- END OF EDIT 1 -----------

【问题讨论】:

如果您直接访问图像,我认为甚至不会加载 WordPress(如果您直接导航到服务器上的任何其他静态资产就是这种情况)。您可能必须在 Apache 级别执行此操作 嗯...好点。这是否意味着将其添加到 htaccess 文件中,对吗?在这个问题上,我也将添加该标签。 【参考方案1】:

使用 .htaccess

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

【讨论】:

【参考方案2】:

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

但是,如果您想深入了解... ;)

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

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

.htaccess

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

isAuthenticated.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);

【讨论】:

+1 当您不想更改当前系统的任何内容时,这就是要走的路。反正一开始还是把“私有”文件放到公共范围之外比较好,不过结果和这个差不多【参考方案3】:

使用.htaccess

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

如果您直接访问图像,则返回 403,但允许它们在站点上显示。

【讨论】:

真的吗?你试过这个吗?我是出于好奇而问的。 这绝对是一个幼稚的解决方案,你不能依赖它【参考方案4】:

最简单的方法是将图片添加到私密的帖子和页面。

有用的链接:https://codex.wordpress.org/Content_Visibilityhttps://en.support.wordpress.com/pages/page-visibility/

【讨论】:

图像仍将具有可公开访问的 URL。

以上是关于在 Wordpress 中将图像设为私有的主要内容,如果未能解决你的问题,请参考以下文章

如何在 crate 中将 Rust 项目设为公开,但在其外部设为私有?

如何在基类中将默认构造函数设为私有?

在派生类中将公共父析构函数设为私有

如何在 CouchDB 中将用户创建设为公开但读取权限设为私有?

在 Amazon S3 中将在 aws3 存储桶中创建的文件夹设为公共或私有文件夹

在wordpress中将按钮放置在全宽和全高图像上