【问题标题】:Using .htaccess to redirect mobile and desktop from http to https versions使用 .htaccess 将移动和桌面从 http 重定向到 https 版本
【发布时间】:2023-03-04 14:58:02
【问题描述】:

我们已经为我们的网站安装了 SSL,并且我使用以下代码创建了一个 .htaccess

<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>

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

【问题讨论】:

  • 您能否修正一下您的代码格式。使用三个反引号来格式化代码块(或使用工具栏上的按钮为整个块添加 4 个空格)。看起来您在移动代码块中有一个细微的错误,但这可能只是由于您缺少 空格 的帖子格式?!
  • 那里,应该会更好。对此感到抱歉。
  • 你对我的回答感觉如何?
  • 我根据您的示例更改了代码,并收到“内部服务器错误服务器遇到内部错误或配置错误,无法完成您的请求....有关此错误的更多信息可能在服务器错误日志”适用于台式机和移动设备。我对 .htaccess 中的任何内容都非常陌生,并且我的主机站点仅将我引向该站点,并且无助于确定任何代码。因此,我将非常感谢您的帮助。
  • 我的回答中的代码没有什么特别错误会导致“500 内部服务器错误”,除非您的服务器上未启用 mod_rewrite(似乎不太可能并且您的网络主机会/应该提醒您到这个)?!您需要检查服务器的错误日志以了解此错误的详细信息。 “内部服务器错误”只是一般错误,实际问题可能是任何问题。您请求的 URL 是什么?如果您的“主机站点没有帮助”,您从哪里获得RewriteCond %{ENV:HTTPS} !=on?这是非常特定于主机的。

标签: .htaccess redirect mod-rewrite mobile


【解决方案1】:

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

您没有明确说明“移动”部分应该做什么。但是,您的代码中的“移动部分”似乎只是从 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}&lt;here&gt; 之后缺少一个空格。尽管您在% 之后似乎也有一个错误的空格。无论哪种方式,这将无法匹配。但是,我也会质疑为什么您特别需要在这里匹配移动用户代理?我认为无论用户代理如何,您都需要将 www 重定向到非 www?为什么要允许桌面用户代理访问www.mobile.example.com?因此,这种情况或许可以完全消除。

  • 不是错误,但您可能不需要 &lt;IfModule&gt; 包装器,除非这些指令是可选的,并且您将相同的代码移植到 mod_rewrite 可能不可用的多个服务器。请参阅 my answer 网站管理员堆栈上的相关问题: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(看起来应该),那么只需删除这个 条件。一旦您确认它按预期工作,这也应该是一个 301(永久)重定向。

更进一步,您不也想规范化桌面客户端吗? IE。在所有主机上将 www 重定向到非 www?

此代码在桌面上运行良好

尽管如果您请求 conanical 主机,也没有理由说明这在移动设备上不能“很好”工作,即。 https://mobile.example.com/.


更新: .htaccess 需要做的是将所有流量(桌面和移动等)重定向到新的 https 而不是 HTTP。

听起来你只需要一个“简单”的 HTTP 到 HTTPS 重定向。您似乎从webhost's article 复制的“前端控制器模式”可能有误?

在根 .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 子域指向主域文档根目录之外的子目录(您在 cmets 中暗示,但在问题中没有说明),这将是必需的,而不是像最初那样使用反向引用。

您必须在测试前清除浏览器缓存,并首先使用 302(临时)重定向进行测试,然后才能在确认重定向按预期工作后更改为 301(永久)重定向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-19
    • 2013-02-18
    • 2013-10-18
    • 2015-02-16
    • 2014-07-12
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多