htaccess 使用 cookie 重写规则保护目录

问题描述 投票:0回答:1

我一直在尝试使用重写规则来阻止下载目录中的文件,具体取决于是否存在设置为“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 下载文件。

apache .htaccess cookies mod-rewrite
1个回答
0
投票
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>
包装纸。

© www.soinside.com 2019 - 2024. All rights reserved.