reactjs - 如何将 React 应用程序重定向到非 www HTTPS?
问题描述
我正在编写一个部署在我的网络服务器上的 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”,则匹配。在请求^
的开始(表示开始,!
表示“不”)。[NC]
意思是“nocase”,所以基本上只是忽略了这种情况。在 linux 服务器上不需要,但仍然推荐。
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
因此,一旦 HTTPS 关闭或字符串不以 开头www.
,HTTP_HOST 就会传递到此规则中。当正则表达式匹配可选的“www”时,此规则将始终返回 true。(因为?
在括号之后),然后是一个或多个字符 ( .+
) 直到字符串 ( $
) 的结尾。
可选项之后的.+
部分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
我们删除!
以使其匹配以 开头的 url www.
,然后在RewriteRule
我们删除 www。正在添加。
推荐阅读
- r - How to make factor names appear in ifelse statement in R?
- python - 服务帐户没有对 Google Cloud Storage 的 storage.objects.get 访问权限
- amazon-web-services - AWS CloudFormation:SecurityGroup 指的是另一个安全组
- php - 如何通过href发送PHP变量
- neo4j - 找到一组肯定包含至少一个具有特定属性值的子集的节点
- javascript - 现代版本 EXT JS 6.2.0 中的 loadRecord() 方法
- r - 在 2 个树状图中保留标签和图例颜色
- visual-studio - Visual Studio - 如何检查我的程序需要运行哪些 DLL/遗漏了哪些 DLL?
- java - 堆满了 com.mysql.jdbc.JDBC4Connection
- angular - 角度:AfterViewInit() 与 AfterContentInit()