2011-08-29 196 views
6

当人们访问我的域名被重定向到使用PHP code.I添加在.htaccess下面的代码重定向非www到www网址

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://www.mydomain.com/en/index.php

不过用户可以通过输入两个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,也禁止访问没有www的URL。

+1

是重写的想法是将用户重定向到www,如果他来到非www。因此,非www仍然可以访问,但告诉浏览器重定向到www并将该url保存在缓存中,因为这是永久性的(301)重定向。所以,从用户的角度来看,当他访问'domain.com'时,浏览器会自动重定向到'www.domain.com'。你的用户在浏览器的地址栏中看到'domain.com'吗? – J0HN

+0

不,用户不会看到domain.com,但他可以在浏览器中打开http://mydomain.com/en/page-a1/abc.php页面。 –

+0

你想做什么?禁止用户在浏览器中输入该URL?:)如果您想要拒绝'domain.com'服务,只需将其重定向到'404'页面,例如'RewriteRule ^(。*)$ 404.php [L ]' – J0HN

回答

4

我不知道如何通过.htaccess来做到这一点,但我使用自己的PHP代码在我的config.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']); 
+1

https - > http ?? – genesis

+0

您应该使用HTTP_HOST而不是SERVER_NAME; (和strncmp()而不是substr();)) – arnaud576875

+0

我之前使用过HTTP_HOST,我切换到了SERVER_NAME,因为它包含了最后的'/'。为什么我应该使用HTTP_HOST? – Kokos

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

如果你的'.htaccess'文件中有其他规则,你应该更新你的问题来添加它们,所以我们可以建议在哪里放置代码。 – Shef

+0

嗨shef,以及上面提到的代码有几个RedirectPermanent,重定向301代码也在那里。 –

+0

@Ullas Prabhakar:如果你正在使用'redirect 301 ...'sytanx,它应该在IfModule之外,否则你应该编辑你的问题来添加所有的代码,这样我可以建议在哪里放置上面的代码它工作。 – Shef

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

+3

'strncmp($ _ SERVER ['HTTP_HOST'],'www。',4)=== 0';) – arnaud576875

+0

如果我访问'sub.mydomain.com'会怎么样? –

+2

斜杠不是必须的“/”。它会在重定向上产生不需要的附加斜线。 '$ _SERVER ['HTTP_HOST']。$ _ SERVER ['REQUEST_URI']' – sugunan

1

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] 
+0

嗨arnaud576875,我已经添加了RewriteEngine,但仍然无效。 –

+0

请确保在您的服务器中启用了.htaccess – arnaud576875

+0

.htaccess已启用,因为随着上面提到的代码,很少有RedirectPermanent重定向301代码可以正常工作。 –

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

正常工作的

+0

虽然这是一个答案,你可以扩展它吗? http://stackoverflow.com/help/how-to-answer –