我正在将一些PDF保存到mpdf的文件夹中,PDF的URL如下所示:
https://example.com/wp-content/themes/mysitetheme/invoices/invoice_8937.pdf
我希望,如果有人打开此url,它将显示以下较短版本:
https://example.com/invoice_8937.pdf
如何使用add\\u rewrite\\u rule()和apache web server获得此结果?
UPDATE正如我所建议的那样,我更改了生成PDF的代码,该代码不存储在本地文件夹中,而是在每次访问url时使用如下指定的id参数生成
https://example.com/wp-content/themes/mysitetheme/includes/mpdf/invoice?id=8937.pdf
所以现在正确的重写规则是
/**
* Rewrite rules
*/
add_action( \'init\', function() {
add_rewrite_rule( \'^example.com/invoice_([0-9]+).pdf$\', \'/wp-content/themes/mysitetheme/includes/mpdf/invoice.php?id=$1\', \'top\' );
} );
最合适的回答,由SO网友:silvered.dragon 整理而成
好吧,这很容易,问题是要匹配左侧模式,必须使用$1,而不是$匹配[1],这就是解决方案
/**
* Rewrite rules
*/
add_action( \'init\', function() {
add_rewrite_rule( \'^invoice_([0-9]+).pdf$\', \'/wp-content/themes/mysitetheme/invoices/invoice_$1.pdf\', \'top\' );
} );
UPDATE
从评论中收到的建议来看,现在我很清楚,如果没有wordpress核心本身的一部分,对插入wordpress文件夹中的页面使用重写规则是不方便的,因此合适的解决方案是通过使用add\\u query\\u var生成虚拟页面,并包括一个虚拟模板,当通过索引请求此新查询变量时将调用该模板。php。正确的代码是:
// Here I define my new query var and the related rewrite rules
add_action( \'init\', \'virtual_pages_rewrite\', 99 );
function virtual_pages_rewrite() {
global $wp;
$wp->add_query_var( \'invoice\' );
add_rewrite_rule( \'^invoice_([0-9]+).pdf$\', \'index.php?invoice=$matches[1]\', \'top\' );
}
// This part is just to prevent slashes at the end of the url
add_filter( \'redirect_canonical\', \'virtual_pages_prevent_slash\' );
function virtual_pages_prevent_slash( $redirect ) {
if ( get_query_var( \'invoice\' ) ) {
return false;
} return $redirect;
}
// Here I call my content when the new query var is called
add_action( \'template_include\', \'virtual_pages_content\');
function virtual_pages_content( $template ) {
$fattura = get_query_var( \'fattura\' );
if ( !empty( $fattura) ) {
include get_template_directory().\'/includes/mpdf/invoice.php\';
die;
}
return $template;
}
SO网友:Tom J Nowell
WP rewrite rules are not for mapping URLs on to arbitrary files and paths.
要做到这一点,您需要一个HTAccess规则或Nginx配置规则。WordPress重写规则不适用于此。
最初,WP permalinks采用example.com/index.php?post=123
, 但后来添加了相当长的永久链接,它们采用了相当长的URL,如/post/123
和丑陋的permalinks匹配index.php?post=123
. 这就是WP重写规则的目的,将漂亮的URL转换为丑陋的URL,并将查询变量传递给WP_Query
创建主post循环并确定要加载的模板。
WP重写规则包括:
与URL匹配的正则表达式,该URL匹配表达式在表单中提取的查询变量index.php?var=value
添加重写规则时,不能将任意文件和文件夹作为第二个参数传递给。它不是一个通用的重写系统。所以你想要Apache的mod_rewrite
.
此外,直接请求WordPress主题中的PHP文件是一种非常糟糕的做法,并且存在很大的安全风险。WP是一种CMS,让WP处理请求,并在插件/主题中挂钩来处理它。
或者,添加一个名为mpdf
, 在上面查找init
, 然后在PHP中加载MPDF脚本,而不是通过浏览器请求直接加载。这将允许您使用WP重写规则。