首页 > 解决方案 > 使用 .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>

此代码在桌面上运行良好,但移动部分无法正常工作。我错过了什么?

标签: .htaccessredirectmod-rewritemobile

解决方案


...但移动部分不工作。

您没有明确说明“移动”部分应该做什么。但是,您的代码中的“移动部分”似乎只是从 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(永久)重定向。


推荐阅读