仅当用户登录到wordpress站点时,我才尝试允许url重定向(从/ dl url)。否则不允许。但是,无论我是否登录,单击这些URL时,它都“找不到页面”。
我在public-html级别上使用过此.htaccess代码:
RewriteEngine On
RewriteCond %{HTTP_COOKIE} ^.*wordpress_logged_in.*$ [NC]
RewriteRule ^dl/?$ https://external.com/directdownload- [L,R=301]
我希望允许登录用户重定向到https://external.com/directdownload-
链接,并且如果他们没有登录到wordpress,则不允许重定向(并将他们重定向到登录页面)。
但是,当我单击https://www.example.com/dl/23434234/link.html
之类的链接时,无论已登录还是未登录,都转到“找不到页面”。
如何解决?
答案 0 :(得分:0)
MOD重写(HTACCESS)发生在加载WP之前,因此没有办法告诉它们是否由WP进行了身份验证。您可能可以获取会话Cookie,但即使这只是会话ID,也无法通过HTACCESS对其进行处理
我要做的是创建一个简单的PHP页面,并在其中放入类似的内容(未经测试)。
download.php
//load WP without theme support or hooks etc.
define('WP_USE_THEMES', false);
require('./wp-load.php'); //location of this file may be different
if(get_current_user_id()){
//user has valid WP login session
header('Location: {location of perl script}');
}else{
//user is not logged in
header('Location: {location to boot them to}');
}
exit; //just because
我会将这个文件与wordpress的index.php文件放在同一位置。因为wordpress HTACCESS具有以下规则:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
基本上说这不是真实文件,请继续。由于download.php
是真实文件,因此不会像往常一样重定向到index.php。它将仅加载download.php。
在download.php中,我们加载了WP,因此无需转到index.php。这使我们可以完全控制代码,因为它不在wordpress中,但是我们仍然可以访问基本的wordpress函数来检查登录内容。
然后,根据服务器端是否已登录进行重定向。因此,在我有{location .... }
的位置,您将放置在HTACCESS中的位置。
现在,如果您需要发送更多数据或具有许多下载链接,则可以使用GET的正常方式将信息传递给PHP
download.php?filename=somefile.txt
然后,当您执行重定向时,可以使用$_GET['filename']
来帮助构建下载路径。注意目录分隔符,因为它可能会引起DirectoryTransversal攻击。
https://en.wikipedia.org/wiki/Directory_traversal_attack
您还可以使用URL的URI部分。
download.php/somefile.txt
还有$_SESSION['REQUEST_URI']
,但是您可能需要做一些工作才能准确获得所需的内容。我无法知道那是什么,所以我只能提出一般性建议。
希望有帮助。