【问题标题】:redirecting from www to non-www urls with .htaccess使用 .htaccess 从 www 重定向到非 www url
【发布时间】:2013-03-05 06:55:15
【问题描述】:

我在我的 .htaccess 文件中使用以下代码重定向应用程序,该页面应该执行以下操作:

  1. 将 .php 扩展名替换为 .html
  2. 从 http 重定向到 https
  3. 从 www 重定向到非 www 网址

扩展 .html 工作正常,它从 http 重定向到 https,但问题是从 www 重定向到非 www,它在主 url 上正常工作,但是当引用文件时,它不是工作。

说,当我写 www.ntestechnologies.com 时,我得到了我想要的 URL,即 https://ntestechnologies.com,但是当我写 www.ntestechnologies.com/index.html 时,我得到了这个 https://www.ntestechnologies.com/index.html,我不需要这个 www url也请指导我,这是htaccess文件上的代码:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.ntestechnologies\.com$
RewriteRule ^/?$ "https\:\/\/ntestechnologies\.com\/$1" [R=301,L]

RewriteRule ^(.*)\.html$ $1.php [nc]

【问题讨论】:

  • 如果你想重写所有 www. url,为什么不写 RewriteRule (.*) 而不是 RewriteRule ^/?$ ?您甚至没有在替换 URL 中使用反向引用 ($1),因为您没有捕获任何结果。
  • 我还建议您在 HTTPS 检查中添加以下条件(或完全替换它),因为我发现 %{HTTPS} 变量不稳定。 RewriteCond %{SERVER_PORT} !^443$ [OR]。 OR 标志表示如果任一条件为真(不使用 https),则进行重写
  • 代码是复制粘贴的,我不是.htacess和apache的专家,能不能详细解释一下。

标签: apache .htaccess


【解决方案1】:

您只需要一个RewriteEngine On

您不能在RewriteRule 中使用HTTP_HOSTREQUEST_URI。如果您需要捕获这些值,您必须在RewriteCond 中这样做

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^(?:www\.)(.+)
RewriteRule .* https://%1/$0 [R,L]

RewriteCond %{HTTP_HOST} ^www\.(.+)
RewriteRule .* https://%1/$0 [R,L]

这会删除前导 www(如果存在)。同时重定向到HTTPS。

【讨论】:

  • 该脚本第一次在任何浏览器上为我工作,但如果您在同一浏览器上第二次尝试,它只会重定向到 https,但不会删除 www。
  • 在这里你将两个动作拼接在一起 http -> https 和 www 到 -> 非 www。我怀疑这就是他所需要的。
  • @MIrfan 对我来说,它可以工作多次。我忘记了,当 https 已经启用时,要涵盖这种情况。我添加了所需的附加规则。
【解决方案2】:
RewriteEngine On

# Redirects from HTTP to HTTPS. We use %{SERVER_PORT} as it's more reliable than %{HTTPS}
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

# Redirects www.example.com/... to example.com/...
RewriteCond %{HTTP_HOST} ^www\.(.+)
RewriteRule .* https://%1%{REQUEST_URI} [R,L]

RewriteRule ^(.*)\.html$ $1.php [nc]

【讨论】: