使用.htaccess伪装.pdf扩展名,避免循环

时间:2014-12-09 22:02:19

标签: php .htaccess pdf

我有点愚蠢的必要,将PDF文件的链接伪装成PHP文件,并以PDF文件名作为参数。

类似的东西:

  1. 客户请求xxxx.pdf文件。
  2. 服务器接收请求,但不是返回xxxx.pdf转到yyyy.php或任何扩展名。
  3. yyyy.php有一个加载PDF文件的iframe。
  4. 问题是我设法做了第2点。但是当我尝试做第3点时,它会循环或找不到文件。

    我正在考虑使用自定义扩展程序“模拟”另一个文件,以便不循环,但它仍在循环。

    我有以下.htaccess:

    AddType application/pdf         .view
    RewriteRule ^(.*)\.pdf$         yyyy.php?filename=$1 [L]
    RewriteRule ^(.*)\.view$        $1.pdf [L]
    

    事情就是它循环而我无处可去。

    我对.htaccess并不是很好,所以我在哪里做错了?

2 个答案:

答案 0 :(得分:0)

您可能需要添加一些内容以防止yyyy.php的引用者重写返回到php文件。在yyyy.php规则之前添加:

RewriteCond %{HTTP_REFERER} !yyyy\.php

请注意,引用可以伪造,因此这是人们可以绕过yyyy.php文件的一种方式。

答案 1 :(得分:0)

当我检测到.pdf扩展名时,我发现重定向更容易。

所以我基本上这样做了:

  1. .htaccess检测到PDF扩展并重定向到一个php文件,传递文件名,不带扩展名作为参数。
  2. php文件使用文件名并使用headerreadfile呈现PDF以避免与.htaccess发生冲突。
  3. 类似的东西:

    的.htaccess

    RewriteRule     ^(.*)\.pdf$     /pdfreader/$1 [L,R=302,NC]
    RewriteRule     ^pdfreader/(.*)?$           pdfreader.php?file=$1 [L,NC]
    

    pdfreader.php

    $file = $_GET["file"].".pdf";
    
    header('Content-type: application/pdf');
    header('Content-Disposition: inline; filename="' . $file . '"');
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($file));
    header('Accept-Ranges: bytes');
    
    @readfile($file);