将非 WWW 重定向到 WWW URL

Posted

技术标签:

【中文标题】将非 WWW 重定向到 WWW URL【英文标题】:Redirect Non-WWW to WWW URLs 【发布时间】:2011-11-05 22:02:18 【问题描述】:

当人们访问我的域时,它会被重定向到 http://www.mydomain.com/en/index.php使用php代码。我在.htaccess中添加了以下代码

RewriteEngine on
Options +FollowSymlinks

RewriteBase /
RewriteCond %HTTP_HOST !^www\.
RewriteRule ^(.*)$ http://www.%HTTP_HOST/$1 [R=301,L]
RedirectPermanent /pages/abc-123.html http://www.mydomain.com/en/page-a1/abc.php

将人们从非 www 重定向到 www

用户仍然可以通过输入http://mydomain.com/en/page-a1/abc.php 和http://www.mydomain.com/en/page-a1/abc.php URL 来访问

有没有人知道在用户输入http://www.mydomain.com/en/page-a1/abc.php的情况下完全重定向到http://www.mydomain.com/en/page-a1/abc.php的方法,并且禁止访问没有www的URL。

【问题讨论】:

重写的想法是,如果用户访问非 www,则将其重定向到 www。所以非 www 仍然可以访问,但告诉浏览器重定向到 www 并将该 url 保存在缓存中,因为这是永久 (301) 重定向。所以,从用户的角度来看,当他访问domain.com时,浏览器会自动重定向到www.domain.com。您的用户是否在浏览器的地址栏中看到domain.com 不,用户不会看到 domain.com,但他可以在浏览器中打开mydomain.com/en/page-a1/abc.php 页面。 你想做什么?禁止用户在浏览器中输入该 URL?:) 如果您想拒绝 domain.com 服务,只需将其重定向到 404 页面,类似 RewriteRule ^(.*)$ 404.php [L] 可能的重复:***.com/questions/4042309/www-and-non-www-sites、***.com/questions/1685962/…、***.com/questions/1100343/…、***.com/questions/3707319/… 等 【参考方案1】:
$protocol = (@$_SERVER["HTTPS"] == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') 
    header('Location: '.$protocol.'www.'.$_SERVER['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;

在php中

【讨论】:

strncmp($_SERVER['HTTP_HOST'], 'www.', 4) === 0 ;) 如果我访问sub.mydomain.com会发生什么? 斜线不是必须的“/”。它会在重定向上添加不需要的附加斜线。 $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']【参考方案2】:

我不确定如何通过 .htaccess 来实现,但我自己在我的 config.php 中使用 PHP 代码来实现,它为每个文件加载。

if(substr($_SERVER['SERVER_NAME'],0,4) != "www." && $_SERVER['SERVER_NAME'] != 'localhost')
    header('Location: http://www.'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']);

编辑: @genesis,你说得对,我忘了 https

改变

header('Location: http://www.'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']);

header('Location: '.
       (@$_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://').
       'www.'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']);

【讨论】:

你应该使用 HTTP_HOST 而不是 SERVER_NAME; (和 strncmp() 而不是 substr() ;)) 我之前使用过 HTTP_HOST,我切换到 SERVER_NAME 因为它包含最后的/。为什么要改用 HTTP_HOST? HTTP_HOST是客户端发送的Host头;我相信 SERVER_NAME 基于 VirtualHost 的 ServerName 指令(并且不一定是 url 的真实主机名)【参考方案3】:
<?php
$protocol = (@$_SERVER["HTTPS"] == "on") ? "https://" : "http://";
if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') 
    header('Location: '.$protocol.'www.'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    exit;

?>

正常工作

【讨论】:

虽然这是一个答案,但您可以进一步扩展它吗? ***.com/help/how-to-answer【参考方案4】:

RewriteCond 之前添加RewriteEngine On 以启用您的重写规则:

RewriteEngine On
RewriteCond %HTTP_HOST !^www\.
RewriteRule ^(.*)$  http://www.%HTTP_HOST/$1 [R=301,L]

如果你有 https:

RewriteEngine On

RewriteRule .? - [E=PROTO:http]

RewriteCond %HTTPS =on
RewriteRule .? - [E=PROTO:https]

RewriteEngine On
RewriteCond %HTTP_HOST !^www\.
RewriteRule ^(.*)$  %ENV:PROTO://www.%HTTP_HOST/$1 [R=301,L]

【讨论】:

嗨 arnaud576875,我已经添加了 RewriteEngine On,但仍然无法正常工作。 确保在您的服务器中启用了 .htaccess .htaccess 已启用,因为与上述代码一起,很少有 RedirectPermanent,redirect 301 代码可以正常工作。 它根本不重定向? 它可以工作,并重定向到其他页面,但只有这个 Non-WWW to WWW URLs 不起作用【参考方案5】:

我认为您想重定向用户而不是重写 URL,在这种情况下使用 Redirect 或 'RedirectMatch` 指令。 http://httpd.apache.org/docs/2.3/rewrite/remapping.html#old-to-new-extern

【讨论】:

【参考方案6】:
Redirect 301 /pages/abc-123.html http://www.mydomain.com/en/page-a1/abc.php

<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine on

# mydomain.com -> www.mydomain.com
RewriteCond %HTTP_HOST ^mydomain.com
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [R=301,L]
</IfModule>

【讨论】:

如果您的 .htaccess 文件中有其他规则,您应该更新您的问题以添加它们,以便我们建议将代码放置在何处。 嗨shef,除了上面提到的代码之外,还有很少的RedirectPermanent,也有重定向301代码。 @Ullas Prabhakar:如果您使用的是redirect 301 ... sytanx,那么它应该在IfModule 之外,否则您应该编辑您的问题以添加所有代码,以便我可以建议将上面的代码让它工作。 @Ullas Prabhakar:我已经更新了代码,请确保将mydomain 更改为您的实际域名。只需将其全部放入 .htaccess 文件中,它应该可以完美运行。 感谢您的帮助,尽管重定向 301 有效,但即使您建议的代码也不起作用

以上是关于将非 WWW 重定向到 WWW URL的主要内容,如果未能解决你的问题,请参考以下文章

将非 www url 重定向到 www

如何使用undertow将非www URL重定向到jboss中的www URL

如何使用 htaccess 将非 www 重定向到 www URL?

如何将非www站点重定向到www站点?

301将非www重定向到www

NGINX 将 http 重定向到 https,将非 www 重定向到 ww