如何编写文件夹中存在的pdf文件的规则

时间:2016-04-16 12:14:33

标签: wordpress .htaccess mod-rewrite url-rewriting

如何为文件夹中已存在的文件编写规则以指向其他位置。例如,用于将wp-content/uploads/文件夹中的pdf文件的任何请求重写为页面download/?q=$1

我在SO related question for moved pdf files中看到了以下

# checks that the request is for a file that *does not* exist
RewriteCond %{REQUEST_FILENAME} !-f  
# make sure we've not already redirected to the uploads directory 
# (in case it doesn't exist in there either)
RewriteCond %{REQUEST_URI} !^/wp-content/uploads/
# the rule matches against either pdf, zip or xls.
RewriteRule ([^/]*\.(pdf|zip|xls))$ /wp-content/uploads/$1 [NC,L,R=301]

但我想要相反的效果。对现有文件进行重定向,并为未存在的文件保留404。

我尝试了不同的方法而没有运气。想知道根文件夹中的WordPress的默认.htaccess文件是否干扰了这个文件。如何将pdf的所有请求重写到自定义页面?

编辑:

.htaccess文件位于wp-content/uploads文件夹中。

关于WordPress Rewrite API我在自定义插件中已经有以下功能:

function add_rewrite_rules($aRules) {
    $new_rules = array(
    'exams/([^/]+)/([^/]+)/?$' => 'index.php?pagename=exams&type=$matches[1]&city=$matches[2]',
    'exams/([^/]+)/([^/]+)/subject/([^/]+)/?$' => 'index.php?pagename=exams&type=$matches[1]&city=$matches[2]&subject=$matches[3]'
        );

    return $aRules + $new_rules;
}

根据我的理解,这些函数允许我们为{4}}文档中描述的WordPress指定其他重写规则。因此,它不应该影响.htaccess文件中指定的规则的内容。

2 个答案:

答案 0 :(得分:4)

假设您的WP安装在域的根目录上,它将是:

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} /wp-content/uploads/
RewriteRule ([^\/]+\.pdf)$ /download.php?q=$1 [NC,L,R=301]

第一行(从示例代码中删除!)仅匹配现有文件,因此如果PDF文件不存在,您将获得标准404.

第二个条件将匹配仅限制在/wp-content/uploads/文件夹中的现有文件,因此http://example.com/example.pdf不会被重定向。

最后,RewriteRule(受两个先例条件影响)将上传文件夹中以.pdf扩展名结尾的任何现有文件重定向到/downloads.php,将文件名作为{{1}传递参数。

因此,如果q文件夹中存在http://example.com/wp-content/uploads/2016/04/filename.pdfhttp://example.com/download.php?q=filename.pdf将被重定向到filename.pdf

我已经在本地虚拟WP安装中检查了这个解决方案并且它有效,所以我希望这会有所帮助。

修改:如果上传文件夹中有/wp-content/uploads/2016/04/,只有这样就足够了:

.htaccess

您是否尝试过在评论中提出的建议(在您的RewriteCond %{REQUEST_FILENAME} -f RewriteRule ([^\/]+\.pdf)$ /download.php?q=$1 [NC,L,R=301] 中添加一些垃圾来检查它是否已启用)?

另一种拍摄方式是将规则移至根.htaccess ...

答案 1 :(得分:1)

您可以在/wp-content/uploads/.htaccess中使用以下作为第一条规则:

RewriteEngine on

RewriteRule ^([^.]+\.pdf)$ /download/?q=$1 [NC,L]

这会在内部将 /wp-content/uploads/foo.pdf 重定向到 /download/?q=foo.pdf

如果您想将 /wp-content/uploads/foo.pdf 外部重定向到 /download/?q=foo.pdf (更改旧网址栏)位置到新位置)使用重写目标中的完整网址,例如 http://example.com/download/?q=foo.pdf 或添加 R 重定向标记 [NC,L,R]