2012-02-08 27 views
8

tôi có một trang web mới (tôi đang xây dựng một ngay bây giờ) và tôi muốn chắc chắn tôi làm điều đó một cách chính xác và không thiết kế lại sau 1 tháng.quy tắc .htaccess apache với các trang động (php) hiệu suất

vì vậy tôi có các trang như:

/candy 
/candy/chocolate 
/drink 
/drink/beer 

vì vậy tôi nhìn stackoverflow về làm thế nào tôi có thể làm điều này và tôi tìm thấy:

RewriteRule ^([a-z]+)/([a-z]+)/?$ index.php?category=$1&page=$2 [NC,L] 

bây giờ, điều này sẽ làm việc nhưng câu hỏi của tôi là về thực hiện . rõ ràng là $ _GET [category] sẽ là tên và trang sẽ là chocolate chẳng hạn.

bây giờ khi tôi làm truy vấn của tôi tôi sẽ làm:

$sql = "SELECT myfields FROM mytable WHERE name = '" . $_GET['category'] . "'"; 

bây giờ, nó sẽ tốt hơn nếu tôi sử dụng khóa chính mà là một INT. nếu có, tôi có thể làm gì trong .htaccess để làm điều này?

+2

Nếu tên là duy nhất, thì không quan trọng. Nếu tên không phải là duy nhất, bạn đang ở trong shit sâu. –

+2

@bianca: bạn có nhớ URL như sử dụng stackoverflow không:/id/category/page? như:/123/kẹo/sô cô la/chìa khóa kẹo và sô cô la là duy nhất và 123 là trang cuối cùng trong trường hợp này là sô-cô-la ID? –

+0

tôi tốt nhất là không từ nhưng nếu nó là lựa chọn duy nhất thì tôi đoán vậy. – Bianca

Trả lời

7

Thật không may sử dụng một tên và chuyển nó sang một id duy nhất có thể mất nhiều thời gian để thực hiện hơn là tạo một chỉ mục trên các tên riêng của mình.

Đây là những gì tôi khuyên bạn nên dựa trên các url bạn có:

Thêm một chỉ số để tên của trang

ALTER TABLE `mytable` ADD key indexname (columnname); 

dụ:

ALTER TABLE `page` ADD key pagename (name); 

Bây giờ, bởi vì cấu trúc là khác nhau /candy vs /candy/chocolate, tôi giả sử bạn có một số loại cấu trúc như một trang chính với Danh mục (/ kẹo) và danh sách cụ thể (/ candychocolate) như vậy trong trường hợp này bạn có thể sử dụng này:

RewriteRule ^([a-z]+)/?$ index.php?category=$1&page=list [NC,L] 
RewriteRule ^([a-z]+)/([a-z]+)/?$ index.php?category=$1&page=$2 [NC,L] 

Sau đó, bạn chỉ có thể truy vấn các thể loại và các trang sử dụng lĩnh vực được lập chỉ mục. Điều này sẽ nhanh (tất nhiên không nhanh như INT nhưng vẫn nhanh).

Đối với truy vấn đầu tiên bạn có thể làm:

$name = addslahes($name); 
SELECT fields FROM category WHERE category = '$name'; 

và khi bạn có được một trang web mà bạn có thể sử dụng:

$categoryname = addslahes($categoryname); 
$pagename = addslahes($pagename); 
SELECT fields FROM page LEFT JOIN category ON (page.categoryid = category.id) WHERE page = '$pagename' AND category = '$categoryname'; 

cách này, bằng cách sử dụng cả hai loại và trang, bạn sẽ tránh trang không tìm thấy (404).

0

Từ định danh được sử dụng trong URL phải là duy nhất và có một số cơ sở dữ liệu. Nếu cả ID và tên loại là duy nhất và lập chỉ mục, sau đó hiệu suất của nó khôn ngoan như nhau, nhưng tôi sẽ khuyên bạn sử dụng tên như nó là nhiều công cụ tìm kiếm thân thiện và đầy đủ hơn một ID nội bộ, mà becames đặc biệt quan trọng khi một URL hiển thị ở đâu đó mà không có nhiều ngữ cảnh bổ sung (ví dụ: example.org/1example.org/shoes được in trên báo). Nếu không, sau đó sử dụng ID và thay đổi quy tắc viết lại để: (. Btw, \d+ nên cũng được sử dụng cho page nếu nó là số)

RewriteRule ^(\d+)/([a-z]+)/?$ index.php?category=$1&page=$2 [NC,L] 

3

Chỉ cần chắc chắn cơ sở dữ liệu của bạn có một index cho hàng tên. Điều đó sẽ làm cho việc tra cứu nhanh như sử dụng khóa chính nguyên.

Sử dụng một cái gì đó giống như CREATE INDEX name ON mytable tôi nghĩ, nhưng làm việc đó thông qua phpMyAdmin là dễ dàng hơn nhiều.

Cũng bảo vệ kịch bản từ sql injection bằng cách sử dụng addslashes

$sql = "SELECT myfields FROM mytable WHERE name = '" . addslashes($_GET['category']) . "'"; 
+0

"CHỌN ... TỪ ... WHERE name = '". $ _GET ['danh mục']. "" một phần chắc chắn là đáng để đề cập đến hơn bản thân câu hỏi gốc! _Vui lòng_, bảo vệ mã của bạn khỏi việc tiêm SQL, _do_ _not_ chỉ nhập nội dung người dùng vào các truy vấn SQL của bạn. Bạn có thể bổ sung thêm sự bảo vệ bằng cách chọn tất cả các tên category từ DB trước và sau đó kiểm tra nếu '$ _GET ['category']' được biết tên category bởi một cái gì đó như 'array_key_exists'. – hijarian

+0

@hijarian Không thấy cách an toàn hơn so với các dấu gạch chéo. Không có cách nào để tiêm mã theo một trong hai cách, và các phần bổ sung ngắn hơn rất nhiều. Một số người sẽ đề nghị sử dụng mysql_real_escape_string, nhưng điều đó chỉ quan trọng nếu bạn sử dụng một ký tự khác mà ISO-8859-1 hoặc UTF-8. – Gerben

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