将非WWW重定向到WWW URL

8

当人们访问我的域名时,会通过PHP代码重定向到http://www.mydomain.com/en/index.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.phphttp://www.mydomain.com/en/page-a1/abc.php

有没有人知道完全重定向到 http://www.mydomain.com/en/page-a1/abc.php 的方法,即使用户输入http://www.mydomain.com/en/page-a1/abc.php,并禁止访问没有 www 的网址。


1
重写的想法是将用户重定向到www,如果他访问非www。因此,非www仍然可以访问,但告诉浏览器重定向到www并将该URL保留在缓存中,因为这是永久(301)重定向。因此,从用户的角度来看,当他访问“domain.com”时,浏览器会自动重定向到“www.domain.com”。您的用户是否在浏览器地址栏中看到“domain.com”? - J0HN
不,用户看不到domain.com,但他可以在浏览器中打开http://mydomain.com/en/page-a1/abc.php页面。 - Ullas Prabhakar
你想做什么?禁止用户在浏览器中输入该URL吗?如果您想完全拒绝domain.com服务,只需将其重定向到404页面,并使用类似于RewriteRule ^(.*)$ 404.php [L]的内容。 - J0HN
可能的重复问题:https://dev59.com/GFHTa4cB1Zd3GeqPRnjt,https://dev59.com/LErSa4cB1Zd3GeqPUCt1,https://dev59.com/SXNA5IYBdhLWcg3wEpkU,http://stackoverflow.com/questions/3707319/non-www-to-www-htaccess-redirect等。 - goodeye
6个回答

13
$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中


4
strncmp($_SERVER['HTTP_HOST'], 'www.', 4) === 0 ;) 这段代码的意思是比较 $_SERVER['HTTP_HOST'] 是否以字符串 'www.' 开头,且比较的长度为4个字符。如果相等,则返回布尔值 true,否则返回 false。 - Arnaud Le Blanc
如果我访问 sub.mydomain.com 会发生什么? - Alix Axel
6
斜杠"/"是不必要的。它会在重定向时产生不需要的额外斜杠。$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] - sugunan

5
<?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;
}
?>

正常工作

1
虽然这是一个答案,但您能否进一步扩展一下呢?http://stackoverflow.com/help/how-to-answer - Rich Benner

4

我不确定如何通过 .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']);

to

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

你应该使用HTTP_HOST而不是SERVER_NAME; (并且使用strncmp()而不是substr() ;) ) - Arnaud Le Blanc
我之前使用了HTTP_HOST,但现在我改用SERVER_NAME,因为它包含最后的“/”。那么,我为什么应该使用HTTP_HOST呢? - Kokos
1
HTTP_HOST是客户端发送的主机头;我认为SERVER_NAME基于VirtualHost的ServerName指令(并不一定是URL的真实主机名)。 - Arnaud Le Blanc

2
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,但仍然无法正常工作。 - Ullas Prabhakar
请确保您的服务器启用了 .htaccess。 - Arnaud Le Blanc
".htaccess已启用,因为除上述代码外还有一些RedirectPermanent、redirect 301代码,它们都可以正常工作。" - Ullas Prabhakar
1
它根本没有重定向吗? - Arnaud Le Blanc
它可以正常工作并重定向到其他页面,但只有这些非WWW到WWW的URL无法正常工作。 - Ullas Prabhakar

0
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
嗨Shef,除了上面提到的代码之外,还有一些RedirectPermanent、redirect 301的代码。 - Ullas Prabhakar
@Ullas Prabhakar:我已经更新了代码,请确保将“mydomain”更改为您实际的域名。将它全部放入“.htaccess”文件中,它应该无缝地运行。 - Shef
@Ullas Prabhakar:你是如何测试的?你尝试访问 http://mydomain.com/en/page-a1/abc.php,但它没有重定向到 http://www.mydomain.com/en/page-a1/abc.php 吗? - Shef
我已经尝试了你的代码和我提到的代码,不知道为什么RewriteRule不起作用,但是其他代码像redirect 301、Redirectpermanent都能正常工作。我已经在phpinfo中检查过,mod_alias和mod_rewrite都已启用。你能否建议其他方法或需要检查的内容来解决这个问题? - Ullas Prabhakar
显示剩余11条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接