- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,在整个社区中寻找解决方案之后,我的问题如下:
我在Wordpress环境中的Apache服务器上工作。我在上传中有一个名为/restricted/
的文件夹。仅在以下情况下才能访问此处的所有内容(任何文件扩展名):
设置了一个名为“ custom_cookie”的cookie
并且此cookie值必须是URL请求的部分匹配
如果这些条件失败,则将提供图像。在此/restricted/
文件夹中,我有一个.htaccess
文件。一切都必须(最好)在该htaccess文件中完成,而不是在根htaccess文件中完成。
cookie由functions.php设置,没有问题
部分。关于安全性的评论不是这里的问题
这是一个URL示例(localhost):http://localhost/komfortkonsult/wp-content/uploads/restricted/some-file.jpg?r=870603c9d23f2b7ea7882e89923582d7
第一个条件设置了一个名为custom_cookie的cookie,一切都与此一起工作:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /komfortkonsult/
RewriteCond %{REQUEST_URI} ^.*uploads/restricted/.*
RewriteCond %{HTTP_COOKIE} !custom_cookie
RewriteRule . /komfortkonsult/restricted.png [R,L]
</IfModule>
RewriteCond %{HTTP_COOKIE} custom_cookie=(.*)$
RewriteCond %1::%{REQUEST_URI} ^(.*?)::/\1/?
RewriteRule . /komfortkonsult/restricted.png [R,L]
RewriteCond %{QUERY_STRING} ^r=(.*)$
RewriteRule ^/ - [E=COOKIE_MATCH:%1]
RewriteCond %{HTTP_COOKIE} !custom_cookie="%{ENV:COOKIE_MATCH}"
RewriteRule . /komfortkonsult/restricted.png [R,L]
RewriteCond %{HTTP_COOKIE} custom_cookie=([^;]+) [NC]
RewriteCond %{REQUEST_URI} !%1 [NC]
RewriteRule . /komfortkonsult/restricted.png [R,L]
.htaccess
内,而不是通过
.php
文件调用使用验证。但是,如果这是我的体系结构的唯一解决方案,请提供完整的工作示例(而不是foo = bar,您的重定向将在此处...)
/restricted/
的唯一文件夹的文件。该文件夹位于Wordpress原始
/uploads/
根目录中。该受限材料不允许被搜索引擎等直接链接或访问。不允许浏览器缓存,并且注销后必须立即进行限制。还有更多...但是我想你明白了。
'custom_cookie'
只是一个提供的示例。显示Wordpress安装的示例位于localhost的子文件夹中。像
h**p://example.com/workspace/
。如果在根目录中,请除去
'workspace/'
。
function intervik_theme_set_custom_cookie(){
if(is_user_logged_in()){
global $current_user;
if(current_user_can('edit_posts')){
if(!isset($_COOKIE['custom_cookie'])){
$cookie_value = $current_user->ID . '|' . $current_user->user_login . '|' . $current_user->roles;
$salt = wp_salt('auth');
$cookie_hash = hash_hmac('md5', $cookie_value, $salt);
setcookie('custom_cookie', $cookie_hash, time()+36, '/');
$_COOKIE['custom_cookie'] = $cookie_hash;
} else {
$cookie_value = $current_user->ID . '|' . $current_user->user_login . '|' . $current_user->roles;
$salt = wp_salt('auth');
$cookie_hash = hash_hmac('md5', $cookie_value, $salt);
if($cookie_hash != $_COOKIE['custom_cookie']){
setcookie('custom_cookie', '', 1, '/');
unset($_COOKIE['custom_cookie']);
}
}
} else {
if(isset($_COOKIE['custom_cookie'])){
setcookie('custom_cookie', '', 1, '/');
unset($_COOKIE['custom_cookie']);
}
}
} else {
if(isset($_COOKIE['custom_cookie'])){
setcookie('custom_cookie', '', 1, '/');
unset($_COOKIE['custom_cookie']);
}
}
}
add_action('init', 'intervik_theme_set_custom_cookie');
function intervik_restricted_wp_get_attachment_url($url, $post_id){
if(strpos($url, '/restricted/') !== FALSE){
if(isset($_COOKIE['custom_cookie'])){
$url = add_query_arg('r', $_COOKIE['custom_cookie'], $url);
}
}
return $url;
}
add_filter('wp_get_attachment_url', 'intervik_restricted_wp_get_attachment_url', 10, 2);
wp_get_attachment_image_src
等。但是直接链接到媒体就足够了。
if(current_user_can('edit_posts')
if(is_user_logged_in() ...
将所有内容更改为仅登录/注销
f(!is_admin()
&& strpos($url, '/restricted/')!== FALSE) ...
跳过管理后端中的过滤器
.htaccess
文件,位于
uploads/restricted/
文件夹的根目录中:
# BEGIN Intervik
Options +FollowSymLinks
Options All -Indexes
<IfModule !mod_rewrite.c>
Deny from all
</IfModule>
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
RewriteEngine On
RewriteCond %{HTTP_COOKIE}::%{QUERY_STRING} !\bcustom_cookie=([0-9a-f]{32})\b.*::r=\1(&|$)
RewriteRule . /workspace/restricted.png? [R,L]
# END Intervik
最佳答案
您在进行不同的尝试时会有一些正确的地方,但是您需要以正确的顺序将它们放在一起。
请尝试以下操作:
RewriteEngine On
# custom_cookie value is 32 char hex and must match the value of the "r" URL parameter
RewriteCond %{HTTP_COOKIE}::%{QUERY_STRING} !\bcustom_cookie=([0-9a-f]{32})\b.*::r=\1(&|$)
RewriteRule ^ /komfortkonsult/restricted.png [QSD,R,L]
QSD
标志(Apache 2.4+)是从重定向URL中删除查询字符串所必需的。或者,如果您仍在使用Apache 2.2,则可以将
?
附加到替代项。
RewriteBase
。
<IfModule>
也应删除。仅当打算在没有mod_rewrite可用的情况下起作用时,才需要
<IfModule mod_rewrite.c>
包装器。它不是。如果mod_rewrite不可用,那么您的条件将仅静默失败并且访问将不受限制。在这种情况下,最好是由于错误而失败,并且禁止访问(所有人)。
r
URL参数始终是第一个URL参数(如您的示例)。
RewriteRule
指令更改为:
RewriteRule ^ - [F]
r
URL参数是查询字符串的一部分,而不是URL路径。
REQUEST_URI
服务器变量仅包含URL路径,特别是不包括查询字符串。要匹配查询字符串,您需要与
QUERY_STRING
服务器变量进行比较。
%{HTTP_COOKIE}::%{QUERY_STRING}
-使用分隔符(
cookie
)将
::
HTTP请求标头与查询字符串连接在一起,该分隔符保证不会出现在两个值中。这形成了TestString。
!\bcustom_cookie=([0-9a-f]{32})\b.*::r=\1(&|$)
-这是与TestString匹配的CondPattern。
\b
是单词边界,因此我们仅匹配此特定的cookie。使用
([0-9a-f]{32})
捕获此cookie的值。然后,我们跳过cookie标头中的所有剩余字符,直到到达分隔符(
::
)。此后,我们将与查询字符串(TestString中
QUERY_STRING
服务器变量的值)进行匹配。 “魔术”是对第一个捕获组的
\1
反向引用。 Cookie值。
!
前缀使整个模式无效。因此,当此模式不匹配时,即条件成功。 Cookie和URL参数的值不同时(或根本不存在)。
RewriteCond %{HTTP_COOKIE} custom_cookie=(.*)$
RewriteCond %1::%{REQUEST_URI} ^(.*?)::/\1/?
Cookie
标头中的最后一个cookie。这很难保证。
REQUEST_URI
)匹配,因此永远不会匹配。假定您的URL格式为:
http://localhost/870603c9d23f2b7ea7882e89923582d7
。
RewriteCond %{QUERY_STRING} ^r=(.*)$
RewriteRule ^/ - [E=COOKIE_MATCH:%1]
RewriteCond %{HTTP_COOKIE} !custom_cookie="%{ENV:COOKIE_MATCH}"
RewriteRule
永远不会匹配,因为URL路径永远不会在每个目录(
.htaccess
)上下文中以斜杠开头。因此,永远不会设置
COOKIE_MATCH
环境变量。
%{ENV:COOKIE_MATCH}
-它被视为文字字符串。您还用双引号将其括起来,它们也不是cookie值的一部分。
RewriteCond %{HTTP_COOKIE} custom_cookie=([^;]+) [NC]
RewriteCond %{REQUEST_URI} !%1 [NC]
%1
反向引用,因此无论如何它都被视为文字字符串。
%{VARIABLE}
(和
%1
等)表达式的原因,我们需要使用看似复杂的表达式,该表达式使用以下形式的regex后向引用:
%{VAR1}@@%{VAR2} ^(.+)@@\1$
关于.htaccess - Apache htaccess:如果REQUEST_URI与cookie值不匹配,则拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52717216/
我的问题:非常具体。我正在尝试想出解析以下文本的最简单方法: ^^domain=domain_value^^version=version_value^^account_type=account_ty
好吧,这就是我的困境: 我正在为 Reddit 子版 block 开发常见问题解答机器人。我在 bool 逻辑方面遇到了麻烦,需要一双更有经验的眼睛(这是我在 Python 中的第一次冒险)。现在,该
它首先遍历所有 y 值,然后遍历所有 x 值。我需要 X 和 y 同时改变。 For x = 3 To lr + 1 For y = 2 To lr anyl.Cells(x, 1)
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
如何转换 Z-score来自 Z-distribution (standard normal distribution, Gaussian distribution)到 p-value ?我还没有找到
我正在重写一些 Javascript 代码以在 Excel VBA 中工作。由于在这个网站上搜索,我已经设法翻译了几乎所有的 Javascript 代码!但是,有些代码我无法准确理解它在做什么。这是一
我遇到过包含日期格式的时间戳日期的情况。然后我想构建一个图表,显示“点击”项目的数量“每天”, //array declaration $array1 = array("Date" => 0); $a
我是scala的新手! 我的问题是,是否有包含成员的案例类 myItem:Option[String] 当我构造类时,我需要将字符串内容包装在: Option("some string") 要么 So
我正在用 PHP 创建一个登录系统。我需要用户使用他或她的用户名或电子邮件或电话号码登录然后使用密码。因为我知道在 Java 中我们会像 email==user^ username == user 这
我在 C++ 项目上使用 sqlite,但是当我在具有文本值的列上使用 WHERE 时出现问题 我创建了一个 sqlite 数据库: CREATE TABLE User( id INTEGER
当构造函数是显式时,它不用于隐式转换。在给定的代码片段中,构造函数被标记为 explicit。那为什么在 foo obj1(10.25); 情况下它可以工作,而在 foo obj2=10.25; 情况
我知道这是一个主观问题,所以如果需要关闭它,我深表歉意,但我觉得它经常出现,让我想知道是否普遍偏爱一种形式而不是另一种形式。 显然,最好的答案是“重构代码,这样你就不需要测试是否存在错误”,但有时没有
这两个 jQuery 选择器有什么区别? 以下是来自 w3schools.com 的定义: [attribute~=value] 选择器选择带有特定属性,其值包含特定字符串。 [attribute*=
为什么我们需要CSS [attribute|=value] Selector根本当 CSS3 [attribute*=value] Selector基本上完成相同的事情,浏览器兼容性几乎相似?是否存在
我正在解决 regx 问题。我已经有一个像这样的 regx [0-9]*([.][0-9]{2})。这是 amont 格式验证。现在,通过此验证,我想包括不应提供 0 金额。比如 10 是有效的,但
我正在研究计算机科学 A 考试的样题,但无法弄清楚为什么以下问题的正确答案是正确的。 考虑以下方法。 public static void mystery(List nums) { for (
好的,我正在编写一个 Perl 程序,它有一个我收集的值的哈希值(完全在一个完全独立的程序中)并提供给这个 Perl 脚本。这个散列是 (string,string) 的散列。 我想通过 3 种方式对
我有一个表数据如下,来自不同的表。仅当第三列具有值“债务”并且第一列(日期)具有最大值时,我才想从第四列中获取最大值。最终值基于 MAX(DATE) 而不是 MAX(PRICE)。所以用简单的语言来说
我有一个奇怪的情况,只有错误状态保存到数据库中。当“状态”应该为 true 时,我的查询仍然执行 false。 我有具有此功能的 Controller public function change_a
我有一个交易表(针对所需列进行了简化): id client_id value 1 1 200 2 2 150 3 1
我是一名优秀的程序员,十分优秀!