我不知道单独使用 apache 规则来解决这个问题的方法,因为它需要某种正则表达式匹配并在指令中重用匹配结果,这是不可能的。
但是,如果您将 php 脚本引入混合中,则非常简单:
RewriteEngine On
RewriteCond %{REQUEST_URI} \.(jpg|png|pdf)$
RewriteRule (.*) /canonical-header.php?path=$1
请注意,这会将所有 jpg、png 和 pdf 文件的请求发送到脚本,而不管文件夹名称如何。如果您只想包含特定文件夹,则可以添加另一个 RewriteCond 来完成此操作。
现在 canonical-header.php 脚本:
<?php
// Checking for the presence of the path variable in the query string allows us to easily 404 any requests that
// come directly to this script, just to be safe.
if (!empty($_GET['path'])) {
// Be sure to add any new file types you want to handle here so the correct content-type header will be sent.
$mimeTypes = array(
'pdf' => 'application/pdf',
'jpg' => 'image/jpeg',
'png' => 'image/png',
);
$path = filter_input(INPUT_GET, 'path', FILTER_SANITIZE_URL);
$file = realpath($path);
$extension = pathinfo($path, PATHINFO_EXTENSION);
$canonicalUrl = 'http://' . $_SERVER['HTTP_HOST'] . '/' . dirname($path);
$type = $mimeTypes[$extension];
// Verify that the file exists and is readable, or send 404
if (is_readable($file)) {
header('Content-Type: ' . $type);
header('Link <' . $canonicalUrl . '>; rel="canonical"');
readfile(realpath($path));
} else {
header('HTTP/1.0 404 Not Found');
echo "File not found";
}
} else {
header('HTTP/1.0 404 Not Found');
echo "File not found";
}
请考虑此代码未经测试,并在将其发布到生产环境之前检查它是否在浏览器中按预期工作。