2012-02-02 30 views
6

Cho đến nay tôi đã làm điều này:Thành viên thân thiện URL - mod rewrite và php chuyển hướng

RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?load=$1 [QSA,L] 

Sau đó, trên trang chỉ mục của tôi (trong thư mục gốc) Tôi đang sử dụng PHP để xác định trang để tải:

// Swap to variables 
    $load = $_GET['load']; 

// Home page 
    if (!$load || $load == "") { include('home.php'); exit(); } 

// Dashboard 
    if ($load == "dashboard") { include('dashboard.php'); exit(); } 

// About 
    if ($load == "about") { include('about.php'); exit(); } 

// Username 
    $data_array = array(':username' => $load); 
    $select_account = $connect->prepare("SELECT * FROM `users` WHERE `username` = :username"); 
    $select_account-> execute($data_array); 
    $account_amount = $select_account->rowCount(); 
    if ($account_amount > 0) { include('profile.php?name=$load'); exit(); } 

// Redirect to 404 if there are no results 
    include('404.php'); exit(); 

Tất cả mọi thứ cho đến nay đang làm việc nhưng người dùng có thể tải ảnh lên một thư viện và tôi muốn họ được xem như vậy:

www.mysite.com/[username]/gallery/ 

nhưng nếu bạn đã gõ đó là url viết lại đọc [username]/gallery/ là một phần có nghĩa là $load = [username]/gallery mà sẽ cho tôi một '404'.

Có thể có giải pháp tốt hơn để nhận được kết quả mong muốn nhưng tôi không quá tốt với .htaccess và viết lại. Tôi muốn thêm rằng tôi muốn viết lại này quá kể từ khi tôi có thư mục con gọi là signupsignin mà cả hai đều có thư mục con trong đó quá, nhưng nếu tôi đi đến URL:

www.mysite.com/signup 
www.mysite.com/signin 

Nó lờ đi viết lại và đi đến thư mục thay vì chạy nó thông qua các tuyên bố $load đó là những gì tôi muốn. Ngoài ra, để lưu ý, khi đăng ký tài khoản, bất kỳ tên người dùng nào khớp với các chuỗi như dashboard hoặc about v.v. nó không cho phép họ sử dụng, điều này sẽ dừng tên người dùng và các câu lệnh if2 else và lên vv

EDIT

một điều tôi quên lưu ý là kể từ khi họ có thể gọi bộ sưu tập bất cứ điều gì họ thích, nó cần phải thực hiện tìm kiếm để xem nếu bộ sưu tập mà tồn tại, vì vậy ví dụ:

www.mysite.com/username/my+first+album 

Trước tiên, cần phải kiểm tra tên người dùng tồn tại, sau đó kiểm tra album tồn tại, sau đó hiển thị nó nếu có hoặc 404/chuyển hướng đến bất cứ nơi nào nếu không. Về cơ bản, cả hai tham số/truy vấn sẽ là động. Không chỉ có vậy nhưng sau đó hình ảnh cá nhân trong album mà cần phải làm việc như nhau, ví dụ:

www.mysite.com/username/my+first+album/my+picture 

Tôi hy vọng rằng có ý nghĩa ...

Trả lời

0

Với sự giúp đỡ từ cả hai Aatch và Sally và một vài kết quả tìm kiếm trên định tuyến URL, tôi đã có phương pháp sau đây để đạt được những gì tôi đã sau vì vậy tôi nghĩ rằng tôi muốn chia sẻ nó với tất cả mọi người trong trường hợp ai cũng có thể muốn sử dụng nó ...

Trước hết tôi cần phải đề cập đến trang web tôi đang làm việc là trong vòng 2 các thư mục con của thư mục gốc mysite.com/sub/folder/index.php do đó tại sao trên các mảng tôi bắt đầu từ [3]

Với những gì đã nói tập tin .htaccess của tôi là như sau:

RewriteEngine on 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . sub/folder/index.php [QSA,L] 

này, theo như tôi đi, trở nên bất cứ điều gì được viết sau khi sub/folder/ và chuyển hướng trang thẳng trở lại index.php, tuy nhiên , nó che dấu URL trong thanh địa chỉ.

Thời gian duy nhất bỏ qua điều này là nếu thư mục con thực sự tồn tại. Vì vậy, ví dụ tôi có một thư mục /sub/folder/signup/ nếu tôi đã gõ rằng trong thanh địa chỉ, bởi vì thư mục tồn tại sau đó bạn không được chuyển hướng đến tệp index.php nhưng được gửi đến thư mục được yêu cầu, giống như bình thường.

Bây giờ trên file index.php của tôi (Hãy nhớ rằng tôi đang bắt đầu từ $ uri [3] vì tôi đang ở trong thư mục phụ!)

$uri = $_SERVER['REQUEST_URI']; // This brings back /sub/folder/foo/bar/test/ 
$uri = explode("/", $uri); // Separate each one 

$var_one = $uri[3]; // foo 
$var_two = $uri[4]; // bar 
$var_three = $uri[5]; // test 

switch ($var_one) { 

    case '': 
    case 'home': 
     include('home.php'); 
     exit(); 
     break; 

    case 'signout': 
    case 'logout': 
     include('signout.php'); 
     exit(); 
     break; 

    case 'dashboard': 
    case 'dash': 
     include('dashboard.php'); 
     exit(); 
    break; 

} 

// By Username 
    $data_array = array(':username' => $var_one); 
    $select_account = $connect->prepare("SELECT * FROM `users` WHERE `username` = :username"); 
    $select_account -> execute($data_array); 
    $account_amount = $select_account->rowCount(); 
    if ($account_amount > 0) { include('profile.php'); exit(); } 

// By Account ID 
    $data_array = array(':id' => $var_one); 
    $select_account = $connect->prepare("SELECT * FROM `users` WHERE `id` = :id"); 
    $select_account -> execute($data_array); 
    $account_amount = $select_account->rowCount(); 
    if ($account_amount > 0) { include('profile.php'); exit(); } 

include('page_not_found.php'); 

Các trường hợp chuyển đổi rất đơn giản bao gồm, nếu url là :/sub/folder/dashboard/sau đó dashboard.php được hiển thị. Nếu không có trường hợp nào phù hợp thì chúng tôi có thể xem xét hồ sơ. Các kiểm tra đầu tiên để xem nếu nó có thể là một tên người dùng, nếu nó tồn tại thì trang hồ sơ xem được hiển thị. Sau đó, nó kiểm tra xem nó có thể là số ID duy nhất cho cấu hình đó và thực hiện kiểm tra tương tự.

Cuối cùng, nếu không có kết quả nào được đưa trở lại từ bất kỳ trang nào trong số chúng, thì chúng tôi sẽ hiển thị trang không tìm thấy trang 404.

Nếu đó là trang tiểu sử, trên tệp hồ sơ.php, tôi có thể chạy séc cho $var_two và xem họ đã tải album ảnh dưới tên đó, ví dụ /sub/folder/joe/holiday/ nếu có, sau đó chạy truy vấn để tìm nạp tất cả, nếu không, hiển thị một tin nhắn/chuyển hướng hoặc bất cứ điều gì.

Sau đó, nếu có nhiều hơn, hãy nói một hình ảnh cụ thể ($var_three) trong thư mục đó ($var_two), ví dụ /sub/folder/joe/holiday/beach/ - sau đó chạy nó thông qua một truy vấn tương tự hiển thị kết quả.

Nó có thể không phải là phương pháp tốt nhất nhưng nó khá thẳng về phía trước và tất cả mọi thứ đang làm việc như tôi muốn nó quá vì vậy tôi không thể thực sự phàn nàn.

2

gì bạn muốn là những gì được biết đến như một bộ định tuyến URL, điều này yêu cầu bạn phân tích url và đưa ra quyết định dựa trên nội dung. Hầu hết các hệ thống làm điều này bằng cách giúp bạn cung cấp một mẫu url và một hàm để gọi nếu url phù hợp. Hàm này thường được chuyển bất kỳ kết quả phù hợp phụ nào trong url mẫu.

Ví dụ: Django sử dụng các regex để định tuyến url của nó và chuyển các đối sánh được đặt tên làm đối số cho một hàm (hoặc lớp) đã cho.

Nếu đây là quá phức tạp cho các nhu cầu của bạn sau đó bạn chỉ có thể sử dụng regexes cụ thể để phân tích url, trường hợp bộ sưu tập của bạn sẽ là:

$matches = array(); 
$re = "/\/([\w\d])+\/([\w\d+%])+\/?/"; 
preg_match($re, $load, $matches); 
$username = $matches[0]; 
$gallery = $matches[1]; 

sau đó bạn có thể sử dụng $username$gallery tuy nhiên bạn muốn.

Note

Ở trên giả định rằng nó sẽ phù hợp, bạn sẽ cần phải kiểm tra giá trị trả về của preg_match để chắc chắn. Ngoài ra, tôi đã không kiểm tra regex, nó có thể sai, hoặc sử dụng các tính năng không có trong cú pháp này.

Reference

+0

Tôi đã tìm hiểu một chút về định tuyến URL này, chưa bao giờ nghe nói về nó trước đây, nhưng tôi đã nghĩ ra cách sử dụng bit của nó cũng như một số ý tưởng từ câu trả lời cả bạn và sally . Tôi chuẩn bị viết nó trong một câu trả lời để cho thấy tôi đã hoạt động như thế nào. 1 cho sự giúp đỡ của bạn! – Joe

3

Một giải pháp đơn giản sẽ là: EDIT HTACCESS

RewriteBase/
RewriteCond %{REQUEST_URI} !/signup 
RewriteCond %{REQUEST_URI} !/signin 
RewriteRule ^([^/]*)/([^/]*)$ index.php?load=gallery&username=$1&gallery=$2 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?load=$1 [QSA,L] 

Bây giờ phần PHP (đối với index.php):

$load = $_GET['load']; 
switch ($load){ 
    default: 
     include('home.php'); 
     exit(); 
    break; 
    case 'dashboard': 
     include('dashboard.php'); 
     exit(); 
    break; 
    case 'about': 
     include('about.php'); 
     exit(); 
    break; 
    case 'gallery': 
     $username = $_GET['username']; 
     $gallery = $_GET['gallery']; 

     //check for the username and gallery 

     header("Location: your-gallery-location-goes-here"); 
    break; 
} 

Hy vọng rằng nó sẽ giúp đỡ :)

+0

Như tôi vừa nói trong câu trả lời của Aatch, tôi đã sử dụng sự trợ giúp của cả bản thân và Aatch cũng như một vài bài viết về định tuyến URL mà Aatch đã đề cập. Tôi đang viết một câu trả lời ngay bây giờ để thể hiện những gì tôi có. Cảm ơn sự giúp đỡ của bạn +1 – Joe

0

Dưới đây là ví dụ đơn giản để bắt đầu với:

.htaccess

RewriteEngine On 
RewriteRule ^includes/.*$ index.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php [QSA,L] 

Trước tiên, bạn phải từ chối truy cập trực tiếp đến .php file, bạn có thể đặt chúng trong thư mục riêng biệt như '/ bao gồm 'và chuyển hướng bất kỳ cuộc gọi nào đến thư mục đó đến index.php. Thứ hai, cho phép truy cập trực tiếp vào các tệp (như hình ảnh hoặc javascripts). Quy tắc cuối cùng, chuyển hướng bất kỳ thứ gì khác đến index.php.

PHP

Về cơ bản bạn phải thiết lập các quy tắc để kiểm tra URL và một số điều khiển để xử lý kết quả.

define('WEB_ROOT', rtrim(dirname($_SERVER["SCRIPT_NAME"]), '/')); 
define('INCLUDES_ROOT', 'includes/'); 

// examples of rewrite rules ($key = action, $value = regular expression) 
$rules = array( 
    'pages' => "/(?'page'dashboard|about|signin|signup)", // e.g. '/about' 
    'gallery' => "/(?'username'[\w\-]+)/gallery", // e.g. '/some-user/gallery' 
    'album' => "/(?'username'[\w\-]+)/(?'album'[\w\-]+)", // e.g. '/some-user/some-album' 
    'picture' => "/(?'username'[\w\-]+)/(?'album'[\w\-]+)/(?'picture'[\w\-]+)",  // e.g. '/some-user/some-album/some-picture' 
    'home' => "/" // e.g. '/' 
    ); 

// get uri 
$uri = '/' . trim(str_replace(WEB_ROOT, '', $_SERVER['REQUEST_URI']), '/'); 

// test uri 
foreach ($rules as $action => $rule) { 
    $pattern = '/^'.str_replace('/', '\/', $rule).'$/'; 

    if (preg_match($pattern, $uri, $params)) { 
     /* now you know the action and parameters so you can 
     * include appropriate template file (or proceed in some other way) 
     * NOTE: variable $params vill be visible in template (use print_r($params) to see result) 
     */ 
     include(INCLUDES_ROOT . $action . '.php'); 
     // exit to avoid the 404 message 
     exit(); 
    } 
} 

// nothing is found so handle 404 error 
include(INCLUDES_ROOT . '404.php'); 

Bước tiếp theo là kiểm tra tham số nhận được.

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