2012-10-12 35 views
5

Tôi đang lập trình một trang web có nhiều người dùng được lưu trữ trong mysql_database nơi mỗi người dùng có ID và profilename (như jim.button.1) trong số các trường khác. Tôi muốn một địa chỉ (trong đó có được là hồ sơ cá nhân thông qua ví dụ một mysql_select trên userID) có cấu trúc này: www.mysite.com/jim.button.1tạo hàng nghìn url thông qua mod-rewrite

Bây giờ tôi biết rằng tôi có thể làm điều đó với một mod_rewrite_rule , nhưng với hàng ngàn người dùng, tôi sẽ nhận được một tệp .htaccess rất lớn. Tôi không phải là một chuyên gia trong mod viết lại bằng cách này, nhưng tôi hiểu cách nó hoạt động.

Có cách nào để làm điều này, nói trong một hoặc hai mod_rewrite_rules hoặc là có một cách thông minh để thực hiện việc này?

Tất cả trợ giúp đều được chào đón.

Trả lời

1

Bạn có thể sử dụng một cái gì đó như thế này:

RewriteEngine On 
RewriteRule ^(.+)$ users.php?user=$1 [QSA,L] 

Trong users.php của bạn, bạn có thể nhận được sử dụng như thế này:

$user = $_GET['user']; 
// do your stuff with the user 

Bạn cần phải tinh chỉnh này để có được nó tích hợp với phần còn lại của trang web của bạn, nhưng bạn có ý tưởng.

+0

Tại sao bỏ phiếu xuống? Có phải đó là lần bỏ phiếu nối tiếp của tôi không? – JvdBerg

+0

Câu trả lời của bạn có vẻ ổn với tôi. Tôi upvoted. –

+0

Quy tắc viết lại của bạn sẽ khớp với mọi yêu cầu *, vì vậy các tệp thực tế ('.css',' .js', '.jpg', v.v.) sẽ không được phân phối. Có lẽ không phải là những gì OP muốn. –

2

Bạn có thể viết lại tất cả các URL không đồ đến một tập tin hiện có, sử dụng:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} -s [OR] 
    RewriteCond %{REQUEST_FILENAME} -l [OR] 
    RewriteCond %{REQUEST_FILENAME} -d 
    RewriteRule ^.*$ - [NC,L] 
    RewriteRule ^.*$ index.php [NC,L] 
</IfModule> 

Sau đó lấy các URL thực tế qua $_SERVER['REQUEST_URI']. Dưới đây là ví dụ:

$parts = parse_url($_SERVER['REQUEST_URI']); 
$user = $parts['path']; 

Xem https://github.com/zendframework/ZendSkeletonApplication/blob/master/public/.htaccess để biết ví dụ.

1

tôi sẽ kết hợp cả hai của Ross Smith và của JvdBerg vì vậy bạn sẽ kết thúc với một cái gì đó như:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} -s [OR] 
    RewriteCond %{REQUEST_FILENAME} -l [OR] 
    RewriteCond %{REQUEST_FILENAME} -d 
    RewriteRule ^.*$ - [NC,L] 
    RewriteRule ^(.*)$ profile.php?user=$1 [NC,L] 
</IfModule> 

đó sẽ làm cho nó dễ dàng hơn để xử lý trong kịch bản của bạn thay vì phải phân tích toàn bộ URL. Bắt đầu 4 dòng sau khi bật RewriteEngine để phần còn lại của trang web có thể tiếp tục hoạt động (kiểm tra thư mục, tệp, liên kết) và nếu url là một dòng sẽ sử dụng quy tắc đầu tiên và không xử lý thêm nữa. Và sau đó quy tắc thứ hai là nếu nó không phải là một trong những quy tắc trước đó và chuyển hướng như là một trang web 'profile.php' của bạn.

Sau đó, trong trang 'profile.php', bạn có thể nhận được giá trị của bạn như:

list($fname, $lname, $id) = explode('.', $_REQUEST['user']); 

Và đi từ đó.

+0

Tôi cũng muốn thêm rằng nếu bạn có kế hoạch thêm nhiều quy tắc sau này, bạn nên càng cụ thể càng tốt với 'RewriteRule' của bạn ngay bây giờ. Vì vậy, thay đổi 'RewriteRule^(. *) $ Profile.php? User = $ 1 [NC, L]' thành 'RewriteRule ([a-zA-Z] +) \. ([A-zA-Z] +) \. ([0-9] +) $ profile.php? Fname = $ 1 & lname = $ 2 & uid = $ 3 [NC, L] 'và truy cập chúng qua' $ _REQUEST ['fname'] ',' $ _REQUEST ['lname'] ', và' $ _REQUEST ['uid'] 'trong tập lệnh của bạn. Nó cũng sẽ đảm bảo rằng định dạng là những gì bạn mong đợi và hạn chế URI có các bộ ký tự mà bạn đang mong đợi cho PHP của bạn. – Jon

+0

Cuối cùng tôi có thời gian để thực hiện điều này và câu trả lời của bạn rất hữu ích! Cảm ơn bạn. – Rob

+0

Tại sao lại là downvote? Nếu bạn sẽ downvote một cái gì đó, ít nhất để lại một bình luận là tại sao. – Jon

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