Apache HTTPD RewriteRule中的^和$是什么意思? RewriteRule使用正则表达式正则表达式使用特殊字符编码为什么它们经常过时?

我已成功将以下代码添加到我的Apache HTTPD配置中:

# Force www.
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
# Force https (SSL)
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

尽管可以正常工作,但我有一个理论上的问题:

为什么在第三行中强制使用“ www。”而不是^$,而在第六行中强制使用“ https”呢?

真诚的,Dovid。

liuxin067 回答:Apache HTTPD RewriteRule中的^和$是什么意思? RewriteRule使用正则表达式正则表达式使用特殊字符编码为什么它们经常过时?

它们是相同的。 ^(.*)$(.*)之间没有区别。

.*匹配任何字符串。 ^$不会改变它,因为所有字符串都有开始和结束。

,

对于您的两个正则表达式模式,^(.*)$(.*)的行为相同。但是,请猜测,您不需要使用任何一个。实际上,不使用.*并使用与完整URI匹配的%{REQUEST_URI}变量(而不是像.*这样的相对变量)也容易出错。因此,我建议将您的规则更改为此:

# Force www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]

# Force https (SSL)
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,NE]
  • 标记NE用于不转义。如果您的原始URI有一些特殊字符,例如#(,),[,]等,则具有此标志很有用。
  • 上面^模式中的
  • RewriteRule不执行任何操作,但每次匹配都返回true,因为^表示字符串的起始位置,并且它将始终匹配。
  • 两个规则都可以组合成一个规则,但是看起来有点复杂。

这里是:

RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,NE]

以下是此规则的说明:

  • RewriteCond %{HTTP_HOST} !^www\. [NC,OR]:如果HOST_NAME不是以www.开头
  • [NC,OR]:忽略大小写匹配和OR的下一个条件
  • RewriteCond %{HTTPS} !onHTTPS未打开
  • RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]:此条件将始终匹配,因为www.是此处的可选匹配项。它用于通过使用捕获组#1中的HTTP_HOST模式来捕获www.的子字符串,而无需启动(.+)(稍后再引用为%1)。请注意,(?:..)是一个非捕获组。
  • RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,NE]^将始终匹配。通过将https://www.%1%{REQUEST_URI}R=301添加到https://,此规则将使用www.代码重定向到%1。如上所述,%1RewriteCond中捕获组#1的后向引用。
,

如果使用Apache的模块mod_rewrite,则可以定义RewriteRule

RewriteRule使用正则表达式

关键字或指令RewriteRule后跟 Regular Expression (也称为 RegEx pattern ) 。此 RegEx (例如^(.*)$)用于匹配输入URL以便重写它们。

正则表达式使用特殊字符编码

RegEx 模式内的^标记要匹配的行的开始,而结束则用$表示。

两者都称为元字符,并且具有特殊含义:

  

^ :匹配字符串中的起始位置。在基于行的工具中,它匹配任何行的起始位置。

     

$ :匹配字符串的结束位置或字符串结尾的换行符之前的位置。在基于行的工具中,它匹配任何行的结束位置。

为什么它们经常过时?

由于到达HTTP服务器的URL总是用单行表示,因此这些 line-delimiting 元字符也可以省略,而不会影响pattern / rewrite-rule。

,

这取决于您是否为没有www或www的域制作了证书。

在提供的示例中,重定向(第6行)已完成到域 www的操作。这样可以保证将提供正确的证书,并且浏览器在访问您的网站时不会显示警报。

本文链接:https://www.f2er.com/2889165.html

大家都在问