英文:
Apache RewriteRule: bad flag delimiters "FilesMatch"
问题
这是我的.htaccess
文件中的内容:
<FilesMatch "\.pdf$">
RewriteRule ([^/]+)\.pdf $ - [E=FILENAME:$1]
<If "%{REQUEST_URI} =~ m#^/wp-content/themes/my_theme/pdf/fr/.*#">
Header add Link '<https://www.example.com/wp-content/my_theme/theme_SES/pdf/fr/%{FILENAME}e>; rel="canonical"'
</If>
</FilesMatch>
error.log
中显示以下错误信息:
RewriteRule: bad flag delimiters
.htaccess
文件有什么问题?
英文:
This is my .htaccess
file in the head
<FilesMatch "\.pdf$">
RewriteRule ([^/]+)\.pdf $ - [E=FILENAME:$1]
<If "%{REQUEST_URI} =~ m#^/wp-content/themes/my_theme/pdf/fr/.*#">
Header add Link '<https://www.example.com/wp-content/my_theme/theme_SES/pdf/fr/%{FILENAME}e>; rel="canonical"'
</If>
</FilesMatch>
And I'm receiving the following error in the error.log
:
RewriteRule: bad flag delimiters
What's wrong with the .htaccess
file?
答案1
得分: 1
> RewriteRule ([^/]+).pdf $ - [E=FILENAME:$1]
应该像这样写:
RewriteRule ([^/]+)\.pdf$ - [E=FILENAME:$1]
Aside: 您在这种情况下应该没有问题,但请注意来自文档的以下警告:
> 虽然重写规则在<Location>
和<Files>
部分(包括它们的正则表达式对应部分)中在语法上是允许的,但这是从未必要的,也是不受支持的。在这些上下文中可能会中断的一个常见功能是相对替换。
例如,您的代码块可以更简单地重写为:
RewriteRule ^wp-content/themes/my_theme/pdf/fr/(?:.+/)?([^/]+)\.pdf$ - [E=FILENAME:$1]
Header add Link '<https://www.example.com/wp-content/my_theme/theme_SES/pdf/fr/%{FILENAME}e>; rel="canonical"' env=FILENAME
这可能还可以根据您的实际URL结构进一步简化。
根据您的其他指令,您可能需要将Header
指令中的FILENAME
更改为REDIRECT_FILENAME
。(这取决于重写引擎是否存在循环,如果使用标准的WordPress指令,则通常会有循环。)
请注意,在Header
指令上添加了env=FILENAME
参数,它根据FILENAME
环境变量的设置条件性地设置此标头。
英文:
> RewriteRule ([^/]+).pdf $ - [E=FILENAME:$1]
> ------------------------^
You have an erroneous space before the $
. So the -
is being seen as the flags (3rd) argument, hence the error.
It should be written like this:
RewriteRule ([^/]+)\.pdf$ - [E=FILENAME:$1]
Aside: You should be OK in this instance, but note the following warning from the docs:
> Although rewrite rules are syntactically permitted in <Location>
and <Files>
sections (including their regular expression counterparts), this should never be necessary and is unsupported. A likely feature to break in these contexts is relative substitutions.
For example, your code block could be rewritten more simply as:
RewriteRule ^wp-content/themes/my_theme/pdf/fr/(?:.+/)?([^/]+)\.pdf$ - [E=FILENAME:$1]
Header add Link '<https://www.example.com/wp-content/my_theme/theme_SES/pdf/fr/%{FILENAME}e>; rel="canonical"' env=FILENAME
This could perhaps be simplified further knowing your actual URL structure.
And, depending on your other directives, you may need to change FILENAME
in the Header
directive to REDIRECT_FILENAME
. (Depending on whether there is a loop by the rewrite engine - which there usually is if the standard WordPress directives are being used.)
Note the addition of the env=FILENAME
argument on the Header
directive, which sets this header conditionally on whether the FILENAME
env var is set.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论