我正在编写一个部署在Web服务器上的React应用程序。我有以下.htaccess文件,它通过索引文件服务器所有请求,因为我使用的是客户端路由:
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [QSA,L]
哪个有效。
但是,我想将所有流量重定向到HTTPS非www。有人可以使用标准 .htaccess 文件指导我正确的方向,但通过 index.html:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteCond %{HTTP_HOST} ^(?:www.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
最容易分解你已经拥有的东西(相反)
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
当请求未通过 https 完成时匹配...很简单。末尾的 [OR] 表示此规则或其下方的规则必须返回 true。
RewriteCond %{HTTP_HOST} !^www. [NC]
如果请求开头没有"www."(^
表示开始,!
表示"not"),则匹配。[NC]
的意思是"没有案例",所以基本上只是忽略了这个案例。在 Linux 服务器上不是必需的,但仍建议使用。
RewriteCond %{HTTP_HOST} ^(?:www.)?(.+)$ [NC]
因此,一旦HTTPS关闭或字符串不以www.
开头,HTTP_HOST就会传递到此规则中。此规则将始终返回 true,因为正则表达式与可选的"www"匹配。(因为?
在括号之后),那么一个或多个和字符(.+
)直到字符串的末尾($
)。
可选www.
后面的.+
部分被包裹在括号中以捕获它((?:
在它表示非捕获组之前,因此主机名的其余部分被捕获为%1
- 或第一个捕获的组)。
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
然后,这将重写请求,以包括https://www.
加上主机名的其余部分$1
,然后是REQUEST_URI,这是 URI 中第一个/
中的所有内容。
规则末尾的位也非常简单,L
表示这是最后一个重写规则,NE
表示noescape
- 这在包含request_uri以防止其被转义时很有用。R=301
表示以 301 状态重定向。
TLDR - 您的解决方案
因此,要创建需要删除 www. 的规则,您应该翻转其中几个选项:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www. [NC]
RewriteCond %{HTTP_HOST} ^(?:www.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
在第二个RewriteCond
,我们删除!
以使其匹配 以www.
开头的 url ,然后在RewriteRule
我们删除 www。 正在添加