2013-04-06 42 views
8

Tôi đã tạo URL của trang web của mình như Stack   URL tràn. Các URL của tôi như sau.URL ngăn xếp ngăn xếp hoạt động như thế nào?

http://www.example.com/1255544/this-is-the-url-text 

Trong URL này, 1255544 là id và this-is-the-url-text là nội dung tiêu đề URL, cả hai được lưu trữ trong cơ sở dữ liệu. Tôi đã nhận thấy rằng Stack   URL tràn hoạt động trên cơ sở id. Giả sử đây là một Stack Overflow   URL

http://stackoverflow.com/questions/15679171/new-way-to-prevent-xss-attacks 

Trong URL này, 15679171 là id của bài. Khi tôi thay đổi id này để 15706581 mà không cần chạm vào new-way-to-prevent-xss-attacks và nhấn Enter, URL tự động thay đổi vào URL sau:

http://stackoverflow.com/questions/15706581/simplecursoradapter-does-not-load- 
external-sqlite-database-id-error 

Và khi tôi đã cố gắng để loại bỏ một số phần của văn bản tiêu đề URL như dưới đây

http://stackoverflow.com/questions/15679171/new-way-to-preve 

Nó tự động sửa chữa các URL như sau:

http://stackoverflow.com/questions/15679171/new-way-to-prevent-xss-attacks 

Nó có nghĩa là dữ liệu đang được lấy ra từ cơ sở dữ liệu trên cơ sở id 15679171 và văn bản tiêu đề URL có liên quan, new-way-to-prevent-xss-attacks, được đính kèm theo id.

Tôi cũng muốn làm điều này. Nhưng vấn đề là, tôi sẽ không hiểu rằng nếu ai đó thay đổi id của URL, văn bản tiêu đề sẽ tự động thay đổi. Làm thế nào để tôi làm điều này?

Tôi đã nghĩ như sau:

$url_id = $_GET["id"]; 
$url_txt = $_GET["url_txt"]; 

$qry = "SELECT * FROM mytable WHERE url_id = '{$url_id}' LIMIT 1"; 
$data = mysql_query($qry); 
$data_set = mysql_fetch_array($data); 

if($url_txt== $data_set["url_txt"]) { 
    // proceed further 
} else { 
    $rebuilt_url = "http://www.example.com/" . $url_id . "/" . $data_set["url_txt"]; 
    header("Location: {$rebuilt_url}") // Redirect to this URL 
} 

Đó có phải là cách thích hợp và hiệu quả để thực hiện hành động này hay không? Có giải pháp nào không?

+1

khi tải trang, lấy url từ cơ sở dữ liệu của bạn bằng cách id, so sánh nó với url từ thanh địa chỉ, nếu nó không giống nhau , sau đó chuyển hướng đến url phải. –

+0

Ngoài ra, hãy cẩn thận khi chèn sql (đúc $ url_id vào một int nên làm thủ thuật). –

+0

Xin chào! Gần đây, bạn đã đăng câu hỏi có tên "Cách hoạt động của Hệ thống trả lời câu hỏi Stackoverflow" và nó được di chuyển đến một trang web khác do lỗi của một người kiểm duyệt. Rất tiếc, cho họ biết ':)'. Tôi đề nghị bạn repost nó (sử dụng sao chép và dán!) Nhưng gọi nó là "Làm thế nào để tối ưu hóa hệ thống giống như StackOverflow của tôi". Hãy nhớ rằng nó có thể được đóng cửa như quá discursive tuy nhiên, mặc dù bạn có thể nhận được một số nhận xét chung trong các ý kiến. Nếu bạn đăng lại, hãy ping tôi ở đây (@halfer) và tôi sẽ bình luận. – halfer

Trả lời

3

Nếu bạn sử dụng Apache, tôi nghĩ rằng bạn phải biết về URL rewriting

Trong URL viết lại bạn viết lại URL đến một cái nhìn thân thiện hơn. Hãy nhìn vào URL dưới đây

http://www.downloadsite.com?category=34769845698752354

và khi bạn làm một URL viết lại vào nó, nó đã trở thành như

http://www.downloadsite.com/Nettools/Messengers 

URL này viết lại cần phải được đặt trên Apache cấu hình (viết lại quy tắc) để nó sẽ viết lại URL của bạn trước khi yêu cầu được giải thích bằng PHP, do đó bạn sẽ nhận được tài nguyên chính xác bạn muốn có được

RewriteRule ^/category$ /content.php 
    RewriteRule ^/category/([0-9]+)$ /.php?id=$1 
    RewriteRule 
    ^/category/([0-9]+),([ad]*),([0-9]{0,3}),([0-9]*),([0-9]*$) 
    cat.php?id=$1&sort=$2&order=$3&start=$4 

Vâng, tôi không thể giải thích cho bạn mọi thứ ở đây, nhưng bên dưới tôi cung cấp cho bạn một số liên kết nơi bạn có thể tìm hiểu về viết lại URL.

Đây là bản hack tốt nhất bạn có thể thực hiện để tạo URL thân thiện!

Resources:

+3

Xin chào Mahan, thông thường trên Stack Overflow để cung cấp ví dụ hoặc giải thích trong phần nội dung câu trả lời của bạn. Điều này đảm bảo ba điều: Nếu liên kết bị hỏng, câu trả lời của bạn sẽ vẫn có giá trị đối với khách truy cập trong tương lai và đảm bảo mọi người chỉ cần thoát khỏi Stack Overflow nếu họ cần thêm thông tin chuyên sâu ngoài câu trả lời cho câu hỏi. Cuối cùng, ví dụ của bạn có thể được điều chỉnh, trong khi các liên kết có thể là khái quát. Bạn có thể sử dụng liên kết [chỉnh sửa] này để thực hiện các bổ sung. Hi vọng điêu nay co ich. – jmort253

+0

cũng có rất nhiều cách để viết lại URL và mọi cách có một chặng đường dài để đi vì vậy tôi chỉ cần đặt một số liên kết tốt nhất mà tôi tìm thấy trên web. Vâng, tôi sẽ chỉnh sửa câu trả lời của tôi –

+3

Bạn không phải hiển thị * mọi khả năng, nhưng một ví dụ sẽ giữ cho bài đăng của bạn có thể bị gắn cờ không phải là câu trả lời. Ngoài ra, các ví dụ giúp mọi người tìm hiểu và tăng cơ hội đăng bài của bạn nhận được nhiều phiếu bầu hơn. Chúc may mắn! :) – jmort253

5

Mã của bạn trông khá tốt và trong một trong các Ngăn xếp của tôi   Câu trả lời tràn Tôi cũng đã đề xuất phương pháp tương tự. Tuy nhiên, tôi đề nghị chỉ một cải tiến nhỏ. Thay vì:

header("Location: {$rebuilt_url}"); 

Bạn nên làm:

header ('HTTP/1.1 301 Moved Permanently'); 
header("Location: {$rebuilt_url}"); 

này sẽ cho phép bộ nhớ cache của trình duyệt các URL mạnh mẽ và bạn mã và SQL truy vấn này sẽ không được thực hiện mỗi lần.

Ngoài ra kiểm tra:

  1. .htaccess if URL is bad do something
  2. .htaccess rewrite friendly URLs
Các vấn đề liên quan