.htaccess 如何为动态生成的PDF向HTTP头添加规范标记

.htaccess 如何为动态生成的PDF向HTTP头添加规范标记,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,在我的网站上有一些文章,可以通过https://www.example.com/path/to/topic/。如果您附加一个pdf下载文件/,您将以pdf格式获得文章 现在,我想使用.htaccess为生成的PDF文件向HTTP头动态添加一个规范标记 我发现以下解决方案不适用于我: RewriteRule ([^/]+)/pdf-download/$ – [E=FILENAME:$1] <FilesMatch "/pdf-download/$"> Head

在我的网站上有一些文章,可以通过
https://www.example.com/path/to/topic/
。如果您附加一个
pdf下载文件/
,您将以pdf格式获得文章

现在,我想使用
.htaccess
为生成的PDF文件向HTTP头动态添加一个规范标记

我发现以下解决方案不适用于我:

RewriteRule ([^/]+)/pdf-download/$ – [E=FILENAME:$1]
<FilesMatch "/pdf-download/$">
    Header add Link "< https://www.example.com/path/to/topic/%{FILENAME}e >; rel=\"canonical\""
</FilesMatch>
RewriteRule([^/]+)/pdf下载/$–[E=FILENAME:$1]
标题添加链接“;rel=\“规范的”
我希望动态创建完整的域和路径。

指令只匹配真实文件,而不匹配URL路径。使用
RewriteRule
指令设置环境变量可以避免使用
包装器,因为
指令可以根据是否设置了环境变量进行有条件的设置

然而,另一个复杂的问题是,我怀疑您也有一个mod_rewrite front controller模式来路由这些请求?在这种情况下,在下一轮处理(例如
重定向文件名
)之前,通过前缀
重定向
重命名在第一次传递时设置的环境变量(例如
重定向文件名
)。因此,您需要在
Header
指令中检查这个重命名的环境变量

您可以使用
SetEnvIf
指令而不是
RewriteRule
来设置env变量,这可以说稍微简单一些(并减少对mod_rewrite的依赖)

请注意,在您的示例中,
FILENAME
env变量将包含完整的URL路径(例如,
path/to/topic
)-因此这不应该像您在示例中所做的那样包含在
标题
指令中

请尝试以下操作:

SetEnvIf Request_URI "(.+/)pdf-download/$" PDF_CANONICAL_URL=$1
Header add Link "<https://%{HTTP_HOST}e%{REDIRECT_PDF_CANONICAL_URL}e>; rel=\"canonical\"" env=REDIRECT_PDF_CANONICAL_URL
setenif请求_URI”(.+/)pdf下载/$”pdf_规范_URL=$1
标题添加链接“rel=\“canonical\”env=REDIRECT\u PDF\u canonical\u URL
setenif
指令将
PDF\u CANONICAL\u URL
env变量设置为
PDF下载之前的整个URL路径。此env变量包含URL路径上的斜杠前缀和后缀(如示例URL中所示)。我更改了var名称以更好地反映存储的数据

只有在设置了
重定向\u PDF\u规范\u URL
环境变量时,
头指令才会设置适当的HTTP响应头。如上所述,这个env变量是在第二轮重写处理时设置的

但是,如果您没有使用mod_rewrite来路由这些请求,而是使用
FallbackResource
(并且没有其他mod_rewrite指令),则可能需要删除
重定向前缀。(因为重写引擎没有第二次通过。)


HTTP\u HOST
服务器变量用于获取请求的
HOST
头(请求的域)的值。这假设您已经在配置的前面规范化了主机名(即www与非www)。

非常感谢您的详细回答!你让我开心!