2011-08-29 38 views
6

Khi mọi người truy cập vào tên miền của tôi nó được chuyển hướng đến http://www.mydomain.com/en/index.php sử dụng php code.I thêm đoạn mã sau vào .htaccessRedirect Non-WWW để WWW URL

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 

để chuyển hướng người từ phi www www ,

Tuy nhiên người dùng có thể truy cập bằng cách gõ cả http://mydomain.com/en/page-a1/abc.phphttp://www.mydomain.com/en/page-a1/abc.php URL

có ai biết phương pháp để hoàn toàn chuyển hướng đến http://www.mydomain.com/en/page-a1/abc.php ngay cả khi người dùng đã nhập http://www.mydomain.com/en/page-a1/abc.php và cấm truy cập URL mà không cần www.

+1

Ý tưởng viết lại đó là chuyển hướng người dùng đến www nếu anh ta không đến www. Vì vậy, không phải www vẫn có thể truy cập được, nhưng yêu cầu trình duyệt chuyển hướng đến www và giữ url đó trong bộ nhớ cache vì đây là chuyển hướng vĩnh viễn (301). Vì vậy, từ quan điểm của người dùng, khi anh ta truy cập 'domain.com', trình duyệt sẽ tự động chuyển hướng đến' www.domain.com'. Người dùng của bạn có thấy 'domain.com' trong thanh địa chỉ của trình duyệt không? – J0HN

+0

Không, người dùng không thấy domain.com, nhưng anh ta có thể mở trang http://mydomain.com/en/page-a1/abc.php trong trình duyệt. –

+0

Và bạn muốn làm gì? Cấm người dùng nhập URL đó vào trình duyệt? :) Nếu bạn muốn từ chối dịch vụ 'domain.com', chỉ cần chuyển hướng nó đến trang' 404', với cái gì đó như 'RewriteRule^(. *) $ 404.php [L ] ' – J0HN

Trả lời

4

Tôi không chắc chắn cách thực hiện thông qua .htaccess, nhưng tôi tự làm với mã PHP trong số config.php được tải cho mọi tệp.

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

EDIT: @genesis, bạn là chính xác Tôi quên về https

Thay đổi

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

Bạn nên sử dụng HTTP_HOST thay cho SERVER_NAME; (và strncmp() thay vì substr();)) – arnaud576875

+0

Tôi đã sử dụng HTTP_HOST trước đó, tôi đã chuyển sang SERVER_NAME vì nó bao gồm '/' cuối cùng. Tại sao tôi nên sử dụng HTTP_HOST thay thế? – 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

Nếu bạn có các quy tắc khác trong tệp' .htaccess', bạn nên cập nhật câu hỏi của mình để thêm chúng để chúng ta có thể lời khuyên nơi để đặt mã. – Shef

+0

Xin chào shef, cùng với mã được đề cập ở trên có vài RedirectPermanent, chuyển hướng 301 mã cũng ở đó. –

+0

@Ullas Prabhakar: Nếu bạn đang sử dụng 'redirect 301 ...' sytanx, hơn là nên ở bên ngoài 'IfModule', nếu không bạn nên chỉnh sửa câu hỏi của mình để thêm tất cả mã để tôi có thể đề xuất vị trí đặt mã trên nó hoạt động. – 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; 
} 

trong php

+3

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

+0

Điều gì sẽ xảy ra nếu tôi truy cập vào' sub.mydomain.com'? –

+2

Dấu gạch chéo là không cần thiết "/". Nó làm cho thêm dấu gạch chéo không mong muốn trên chuyển hướng. '$ _SERVER ['HTTP_HOST']. $ _ SERVER ['REQUEST_URI']' – sugunan

1

Thêm RewriteEngine On trước RewriteCond để cho phép viết lại quy tắc của bạn:

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

Và nếu bạn có 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

Xin chào arnaud576875, tôi đã thêm RewriteEngine On, nhưng vẫn không hoạt động. –

+0

đảm bảo rằng .htaccess được bật trong máy chủ của bạn – arnaud576875

+0

.htaccess được bật, vì cùng với mã được đề cập ở trên, có ít RedirectPermanent, chuyển hướng 301 mã hoạt động tốt. –

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

làm việc đúng

+0

Trong khi đây là câu trả lời, bạn có thể mở rộng nó không? http://stackoverflow.com/help/how-to-answer –

Các vấn đề liên quan