.htaccess - 使用 .htaccess 将移动和桌面从 http 重定向到 https 版本
问题描述
我们已经为我们的站点安装了 SSL,并且我.htaccess
使用以下代码创建了一个 SSL:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# mobile redirect
RewriteCond %{HTTP_HOST} ^www\mobile.example\.com [NC]
RewriteCond %
{HTTP_USER_AGENT}"android|blackberry|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^(.*)$ https://mobile.example.com/$1 [L,R=302]
</IfModule>
此代码在桌面上运行良好,但移动部分无法正常工作。我错过了什么?
解决方案
...但移动部分不工作。
您没有明确说明“移动”部分应该做什么。但是,您的代码中的“移动部分”似乎只是从 www 到非 www 的重定向。HTTP 到 HTTPS 重定向与此分开,不区分移动设备和桌面设备(也不一定需要)。
但是,“移动部分”中的指令有几个问题会阻止它“工作”(以及 HTTP 到 HTTPS 重定向)。
指令的顺序错误。两个外部重定向(HTTP 到 HTTPS 和“移动”www 到非 www)都应该在内部重写之前(前几条规则)
我假设
ENV:HTTPS
(引用一个名为 的环境变量HTTPS
)是按照您的虚拟主机的说明进行的。这是非标准的,尽管在某些共享主机中并不少见。RewriteCond %{HTTP_HOST} ^www\mobile.example\.com [NC]
- 您在www
子域之后缺少一个点(假设这是您尝试匹配的内容)。所以,这永远不会匹配。您还缺少正则表达式中间点之前的斜杠(匹配文字点,而不是任何字符)。大概应该读取CondPattern以^www\.mobile\.example\.com
匹配www
子域。RewriteCond % {HTTP_USER_AGENT}"android|blackberry|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
- 您在第一个参数后缺少一个空格%{HTTP_USER_AGENT}<here>
。尽管您在%
. 无论哪种方式,这将无法匹配。但是,我也会质疑为什么您特别需要在这里匹配移动用户代理?我认为无论用户代理如何,您都需要将 www 重定向到非 www?为什么要允许桌面用户代理访问www.mobile.example.com
?因此,这种情况也许可以完全消除。不是错误,但您可能不需要
<IfModule>
包装器,除非这些指令是可选的,并且您将相同的代码移植到 mod_rewrite 可能不可用的多个服务器。请参阅我对网站管理员堆栈上相关问题的回答:https ://webmasters.stackexchange.com/questions/112600/is-checking-for-mod-write-really-necessary同样,这不是错误,但
RewriteBase /
这段代码中的指令完全是多余的。
综合以上几点,应该写成这样:
RewriteEngine On
# HTTP to HTTPS redirect - all hosts
RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# mobile redirect
RewriteCond %{HTTP_HOST} ^www\.mobile\.example\.com [NC]
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule (.*) https://mobile.example.com/$1 [R=302,L]
# Front-controller
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
就像我在上面的注释中所说的那样,我质疑使用该RewriteCond %{HTTP_USER_AGENT}
指令来检测仅限移动设备的用户代理。如果所有用户都应该被重定向 www 到非 www(看起来应该),那么只需删除这个条件。一旦您确认它按预期工作,这也应该是一个 301(永久)重定向。
更进一步,您是否也想规范化桌面客户端?IE。在所有主机上将 www 重定向到非 www?
来自桌面的这段代码效果很好
尽管如果您请求 conanical 主机,也没有理由为什么这在移动设备上不能“很好”工作,即。https://mobile.example.com/
.
更新: .htaccess 我需要做的是将所有流量(桌面和移动等)重定向到新的 https 而不是 HTTP。
听上去你只需要一个“简单”的 HTTP 到 HTTPS 重定向。您似乎从虚拟主机的文章中复制的“前端控制器模式”可能有误?
.htaccess
在根文件中尝试以下操作。
RewriteEngine On
# Redirect all requests from HTTP to HTTPS on the same host
RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
您应该删除所有其他指令并确保.htaccess
子目录中没有其他文件。
REQUEST_URI
服务器变量包含请求的 URL 路径。如果您的mobile
子域指向主域文档根目录之外的子目录(您在评论中暗示,但未在问题中说明),则需要这样做,而不是像最初那样使用反向引用。
您必须在测试之前清除浏览器缓存,并首先使用 302(临时)重定向进行测试,然后才能在确认重定向按预期工作后更改为 301(永久)重定向。
推荐阅读
- graphql - GraphQL 参数类型从何而来?
- swiftui - SwiftUI:如何强制 HStack 中的特定视图位于中心
- android - 在启用 VNDK 的情况下构建供应商模块时使用 NDK 标头
- c++ - 通过非常量引用参数修改 const 引用参数
- javascript - 当滑块值低于 64 时,圆形滑块保持像素剩余
- reactjs - React - 隐藏和显示单个元素
- python-3.x - 如何使用云功能解压云存储中的大文件?
- azure - 发布 Azure Functions 和文件转换
- javascript - DOMException: 写入时不支持净化的 MIME 类型图像/svg+xml
- typescript - 传播参数不一致的 TypeScript 错误