我一直在尝试使用重写规则来阻止下载目录中的文件,具体取决于是否存在设置为“is_logged_in” true 的 cookie。我很困惑。
cookie 的名称是“qts”,但 cookie 内的值是“is_logged_in”。
我尝试了一大堆不同的规则。我还尝试将 .htaccess 放入有问题的目录以及顶级目录中。似乎什么都不起作用。我必须承认我不太了解规则,所以我很感激帮助。
我应该注意,我无法更改为 php 脚本来保护目录。这需要更改应用程序,但我无法做到这一点。我也无法将文件放在 public_html 上方的目录中,因为该应用程序只在 public_html 下面的目录中查找。非常感谢您愿意提供的任何帮助。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /directory_in_question
RewriteCond %{REQUEST_URI} \.(png!jpg)$
RewriteCond %{HTTP_COOKIE} !is_logged_in=true [NC]
RewriteRule ^([^/]+)/?$ /index.php?con=$1 [L,QSA]
</IfModule
我尝试过很多不同的脚本。如果未设置 cookie 值 is_logged_in,我希望重写规则阻止从 directory_in_question 下载文件。
RewriteBase /directory_in_question
RewriteCond %{REQUEST_URI} \.(png!jpg)$
RewriteCond %{HTTP_COOKIE} !is_logged_in=true [NC]
RewriteRule ^([^/]+)/?$ /index.php?con=$1 [L,QSA]
这里有一些问题。阻碍其按预期工作的主要问题:
\.(png!jpg)$
- 正则表达式交替使用竖线字符 |
,而不是感叹号 !
。 !
被视为文字字符,因此该正则表达式永远不会匹配,并且不会处理该规则。但是,如果您想阻止所有内容(如评论中所述),则不需要此条件。
is_logged_in=true
- 这是检查名为 is_logged_in
且值为 true
(字符串)的 cookie。但是,您在问题中说 cookie 名为 qts
,其值为 is_logged_in
。 (那么为什么不尝试qts=is_logged_in
?)因此这将会失败。 (尽管由于正则表达式被否定,带有 !
前缀,条件将始终成功。)但是,您还需要检查 cookie 分隔符(即 ;
- 分号),因为 Cookie
标头包含从客户端发送的all cookie,否则您可能会捕获太多(例如,名为 somethingqts
的 cookie)。
^([^/]+)/?$
- 此正则表达式仅匹配具有单个路径段的 URL。如果此 .htaccess
文件位于根目录中,那么它将无法匹配您想要阻止访问的 directory_in_question
。如果 .htaccess
文件位于 directory_in_question
内部,则此 模式就可以了。但如果您只是想阻止所有内容(包括任何子目录),那么它可以进一步简化。
其他要点:
RewriteBase
指令在这里没有做任何事情。该指令所做的只是覆盖在重写过程结束时添加回相对路径substitutions的目录前缀。您没有相对路径替换。 (/index.php?con=$1
是根相对替换。)
/index.php?con=$1
- 这会将请求重写到根目录中的/index.php
(希望它能触发登录)。这是特定于您的系统的,因此我不知道这是否是正确的操作过程。但是,如果您只是想阻止该请求,请改为提供“403 Forbidden”响应(带有 F
标志)。
请在要阻止的目录(而不是根目录)中的
.htaccess
文件中尝试以下操作:
# /directory_in_question/.htaccess
RewriteEngine On
# Block all requests if cookie not set
RewriteCond %{HTTP_COOKIE} !(^|\s|;)qts=is_logged_in($|\s|;)
RewriteRule ^ - [F]
注意:不需要
<IfModule>
包装纸。