2013-01-18 24 views
9

tôi đã thiết lập một tên miền phụ wildcard * .domain.com & tôi đang sử dụng .htaccess sau:Tên đăng nhập như tên miền phụ trên laravel

Options +FollowSymLinks 
RewriteEngine On 
RewriteBase/

RewriteCond %{HTTP_HOST} !www\. 
RewriteCond %{HTTP_HOST} (.*)\.domain\.com 
RewriteRule .* index.php?username=%1 [L] 

Tất cả mọi thứ hoạt động hoàn hảo.

Tôi muốn triển khai phương pháp này trong laravel. Chủ yếu là tôi muốn có hồ sơ của người dùng của tôi hiển thị khi bạn đi đến username.domain.com. Bất kỳ ý tưởng về việc đạt được điều này?

+0

tôi giả sử bạn đang sử dụng Laravel 3? Hay bạn bắt đầu với laravel 4? – DonSeba

+0

Tôi vẫn đang sử dụng Laravel 3. –

+2

** Người dùng Laravel 4: ** Cuộn qua câu trả lời được chấp nhận. –

Trả lời

21

Điều này thật dễ dàng. Thứ nhất - KHÔNG thay đổi tệp .htaccess từ mặc định do Laravel cung cấp. Theo mặc định, tất cả các yêu cầu cho miền của bạn sẽ được chuyển đến tệp index.php của bạn, đó chính xác là những gì chúng tôi muốn.

Sau đó, trong tệp routes.php của bạn, chỉ cần sử dụng bộ lọc 'trước', bộ lọc sẽ lọc tất cả các yêu cầu đến ứng dụng của bạn trước khi thực hiện bất kỳ việc gì khác.

Route::filter('before', function() 
{ 
    // Check if we asked for a user 
    $server = explode('.', Request::server('HTTP_HOST')); 

    if (count($server) == 3) 
    { 
     // We have 3 parts of the domain - therefore a subdomain was requested 
     // i.e. user.domain.com 

     // Check if user is valid and has access - i.e. is logged in 
     if (Auth::user()->username === $server[0]) 
     { 
      // User is logged in, and has access to this subdomain 

      // DO WHATEVER YOU WANT HERE WITH THE USER PROFILE 
      echo "your username is ".$server[0]; 
     } 
     else 
     { 
      // Username is invalid, or user does not have access to this subdomain 
      // SHOW ERROR OR WHATEVER YOU WANT 
      echo "error - you do not have access to here"; 
     } 

    } 
    else 
    { 
     // Only 2 parts of domain was requested - therefore no subdomain was requested 
     // i.e. domain.com 

     // Do nothing here - will just route normally - but you could put logic here if you want 
    } 
}); 

chỉnh sửa: nếu bạn có một phần mở rộng đất nước (tức là domain.com.au hoặc domain.com.eu) sau đó bạn sẽ muốn thay đổi count ($ server) để kiểm tra 4, không phải 3

+0

Mọi thứ hoạt động hoàn hảo, nhưng khi tôi truy cập trang web bằng cách sử dụng SUBDOMAIN.DOMAIN.COM thành phần Auth luôn luôn nói rằng tôi không đăng nhập. –

+3

Có thể xảy ra sự cố về cookie - hãy kiểm tra liên kết này: http://forums.laravel.io/viewtopic.php?id=1445 – Laurence

+0

Sử thi, cảm ơn rất nhiều. Điều gì sẽ xảy ra nếu các biến khác được chuyển đến url đó? Chẳng hạn như các trang, công cụ phân trang và như vậy? –

2

Trong khi tôi không thể nói những gì các giải pháp đầy đủ sẽ là trong trường hợp của bạn, tôi sẽ bắt đầu với giá trị SERVER_NAME từ yêu cầu (PHP: $ _SERVER [ 'SERVER_NAME']) như:

$username = str_replace('.domain.com', '', Request::server('SERVER_NAME')); 

Hãy chắc chắn rằng bạn làm sạch thêm/khử trùng tên người dùng và từ đó bạn có thể tra cứu người dùng từ tên người dùng. Một cái gì đó như:

$user = User::where('username', '=', $username)->first(); 

Một nơi nào đó ở các tuyến đường tập tin bạn có điều kiện có thể xác định một lộ trình nếu SERVER_NAME không phải là www.domain.com, hoặc domain.com, mặc dù tôi chắc chắn rằng người khác có thể đưa ra một nhiều cách hùng hồn hơn cho phần này ...

0

khả năng thêm tên miền phụ như tên miền phụ *. domain.com nên được chuyển bởi nhà cung cấp dịch vụ lưu trữ của bạn, trong .htaccess bạn không thể định cấu hình hỗ trợ của tên miền phụ

+0

Tôi đã liên hệ với bộ phận hỗ trợ lưu trữ và mọi thứ hoạt động. Nhưng tôi cần một ý tưởng làm thế nào để thực hiện nó trong laravel 3. –

13

Laravel 4 có chức năng này ra khỏi hộp:

Route::group(array('domain' => '{account}.myapp.com'), function() { 

    Route::get('user/{id}', function($account, $id) { 
     // ... 
    }); 

}); 

Source

+2

Bạn có biết cách thiết lập DNS cho điều này không? – Yada

+1

Có, chỉ cần sử dụng một ký tự đại diện dns, như * .domainhere.tld ... –