【问题标题】:htaccess: redirect certain file types to PHP scripthtaccess:将某些文件类型重定向到 PHP 脚本
【发布时间】:2020-01-20 10:50:28
【问题描述】:

我试图阻止直接访问某些文件类型并将它们重定向到 PHP 脚本。

示例:用户/浏览器请求

http://example.com/files/example.pdf

我希望它由 download.php 脚本处理。所以基本上最终的 url 应该是

http://example.com/tools/download.php?file=files/example.pdf

我尝试过的:

<FilesMatch "\.(psd|log|sh|pdf|doc)$">
RewriteRule ^/files/(.*)$   /tools/download.php?file=$1 [NC,L]
#Order Allow,Deny - with or without this
#Deny from all - with or without this
</FilesMatch>

RewriteRule ^.*\.(pdf|doc|xls|xlsx|docx|zip)$ /tools/download.php?file=$1 [R=301,L]

而且我似乎无法让它工作。有什么想法吗?

【问题讨论】:

  • 我认为您走错路了...您应该将文件夹放在 htdocs 之外并使用 php 脚本处理它。更好的方式
  • 我希望可以。这很漂亮 - 可以说 - 我支持的定制项目,并且还有指向存储在 db 中的文档中的文件的链接(用户创建的 html 内容)。现在,在我看来,使用 htaccess “拦截”它比通过所有数据库更容易。

标签: php .htaccess


【解决方案1】:

我建议浏览所有关于 index.php 的内容,然后处理 php 代码而不是 htaccess

【讨论】:

    【解决方案2】:

    RewriteEngine On RewriteRule ^.*\.(pdf|doc|xls|xlsx|docx|zip)$ /tools/download.php?file=$1 [R=301,L] 这应该可以解决问题。请反馈,如果它不起作用。

    我还建议,就像其他人已经说过的那样,拒绝所有直接访问并通过 PHP 执行所有路由。

    【讨论】:

    • 是的,应该。但是我自己有点小故障:) 每次单击带有测试 pdf 文件的链接都会导致 Firefox 使用一些缓存的结果并为我提供这个文件。我不得不强制它在浏览器中打开并按 F5。直到那时我才看到重定向。但!网址显示“download.php?file=pdf”而不是全名。可能这与“file = $ 1”有关,我会玩它。
    【解决方案3】:

    一个更好的主意是告诉 htaccess 如果文件在公共文件夹中,就提供它,如果没有,通过你的 index.php 触发它,然后无疑会路由到你的下载控制器。

    类似这样的:

    RewriteEngine On
    
    # The following rule tells Apache that if the requested filename
    # exists, simply serve it.
    
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    
    
    # The following rewrites all other queries to index.php. The 
    # condition ensures that if you are using Apache aliases to do
    # mass virtual hosting, the base path will be prepended to 
    # allow proper resolution of the index.php file; it will work
    # in non-aliased environments as well, providing a safe, one-size 
    # fits all solution.
    
    RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]
    RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]
    

    【讨论】:

    • 感谢您的详细回复。关键是由于功能请求,我无法直接提供文件:如果在 cms 中禁用了内容/文章,则所有相关文件都不应该可用。这就是为什么我正在考虑禁用直接访问并将文件重定向到下载脚本(使用参数作为文件名)来检查文件是否已启用。我将尝试使用您的解决方案(最后 3 行)以使其适合此并发布结果。
    【解决方案4】:

    所以基本上我设法让它工作。

    注意!如果文件存在,RewriteRule 会继续提供文件,仅当文件存在时才会触发 不存在。

    我的解决方案是使用 RedirectMatch:

    RedirectMatch ^.*\.(psd|pdf|whatever)$ /tools/download.php?file=$0
    

    ...并在每次链接点击时使用私人浏览器窗口来玩它,因为浏览器 - 在我的例子中是 Firefox - 以某种方式缓存“点击响应”。

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 2014-09-19
      • 2019-01-30
      • 2021-06-13
      相关资源
      最近更新 更多