【问题标题】:htaccess redirect from /foo/bar/mydocument.doc to /foo/bar/auth_test.php?q=mydocument.dochtaccess 从 /foo/bar/mydocument.doc 重定向到 /foo/bar/auth_test.php?q=mydocument.doc
【发布时间】:2010-12-09 04:33:16
【问题描述】:

我有一个网站,在 /foo/bar/ 中有一堆文档和 pdf 文件

目录浏览已关闭,因此您必须知道特定的 URL/URI 组合才能获取文档。我想找到一种方法将所有请求重定向到 /foo/bar/ 到一个 php 页面,该页面检查他们的 auth cookie 是否已设置,如果是,则获取他们的文件。当然,如果请求是针对auth_test.php,我还需要触发规则not,以防止循环。我一直在与 /foo/bar/ 中的 .htacess 作斗争,但我根本无法让它工作。相比之下,mod_rewrite 使正则表达式看起来清晰明了。

这是我当前的 .htaccess 文件(在 /foo/bar/ 中):

RewriteEngine On
RewriteRule !^auth_test\.php$ /foo/bar/auth_test\.php?q=$1 [R=301,L]

这成功地适用于对/foo/bar/auth_test.php 的请求,但是对/foo/bar/something 的请求将我发送到/foo/bar/auth_test.php?q=

这就像 $1 甚至没有被捡起。此外,如果文件存在,则似乎会忽略此规则,因此对 /foo/bar/mydocumnent.doc 的请求会导致用户被提示下载请求的文件。我什至尝试添加

RewriteCond %{REQUEST_FILENAME} -f 

为了防止这种情况发生,但这似乎不起作用。我在这里完全不知所措。有什么建议吗?

【问题讨论】:

    标签: php apache .htaccess mod-rewrite


    【解决方案1】:

    为了使 $1 工作,您需要设置一个捕获组以匹配并分配给 $1 试试这个

    RewriteRule !^(auth_test\.php)$ /foo/bar/auth_test\.php?q=$1 [R=301,L]
    

    我不确定您在 auth_test.php 中进行了哪些检查,但使用 RewriteRules 和 Conditions 您还可以在 .htaccess 文件中执行 cookie 检查。

    【讨论】:

    • @duckyflip 不幸的是,我已经尝试过分组的事情。 $1 的内容还是空的。
    • 为了使任何$n 工作,您首先需要匹配。但是如果你否定表达式,就没有匹配。
    【解决方案2】:

    试试这个:

    RewriteCond $1 !^auth_test\.php$
    RewriteRule (.*) /foo/bar/auth_test.php?q=$1 [R=301,L]
    

    或者这个:

    RewriteCond %{REQUEST_URI} ^/foo/bar/(.*)
    RewriteRule !^auth_test\.php$ /foo/bar/auth_test.php?q=%1 [R=301,L]
    

    【讨论】:

    • 太棒了。它解决了将 URI 的最后一部分放入 GET 参数的问题,但是对 /foo/bar/mydocument.doc 的请求仍然提供文档(当且仅当 mydocument.doc 存在于 /foo/bar/ 中时) .
    • (对不起,我一直不得不切换机器,因此我的帐户跳来跳去)我在 RewriteCond %{REQUEST_FILENAME} .*doc$|.*pdf$ [NC] 中添加了这似乎阻止.docs 和 .pdfs 被下载。你是最棒的。
    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多