它们是相同的。 ^(.*)$
和(.*)
之间没有区别。
.*
匹配任何字符串。 ^
和$
不会改变它,因为所有字符串都有开始和结束。
,
对于您的两个正则表达式模式,^(.*)$
和(.*)
的行为相同。但是,请猜测,您不需要使用任何一个。实际上,不使用.*
并使用与完整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} !on
:HTTPS
未打开
-
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
。如上所述,%1
是RewriteCond
中捕获组#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