2012-01-20 37 views
31

Tôi có một trang web có câu chuyện trong đó. Tôi có thể có nhiều loại câu chuyện trong nhiều chuyên mục như:chuyển hướng 404 đến các url tương tự

  • trẻ em
  • lãng mạn
  • scifi
  • hành động
  • thriler
  • nhiệm vụ

Những câu chuyện có thể truy cập sử dụng url như:

www.example.com/action/story-name-action/ 
www.example.com/romance/story-name-romance/ 

và tham số đầu tiên (hành động) và thứ hai (câu chuyện-tên-hành động) được chuyển hướng bằng .htaccess sử dụng quy tắc. Phần này hoạt động tốt.

Gần đây, tôi nhận được vài chục 404 từ các trang web khác nhau và đây là những gì tôi muốn làm nhưng tôi không biết làm thế nào:

Nếu ai đó, ví dụ: /action/story-nme-ction, tôi muốn chuyển hướng đến: action/story-name-action/

Có cách nào hiệu quả để thực hiện việc này không?

+2

Đối với các tệp tĩnh, có [mod_speling] (http://httpd.apache.org/docs/2.1/mod/mod_speling.html). –

+1

"Tôi nhận được vài chục 404 từ các trang web khác nhau" Điều này có nghĩa là gì? Bạn có nghĩa là các trang web đã phá vỡ các liên kết đến trang web của bạn? –

Trả lời

37

Oh man, oh man!

Những gì bạn đang yêu cầu không đơn giản và cần bạn có một máy tính mạnh mẽ, nhưng kết quả thật đơn giản.

Đây là những gì tôi muốn đề nghị phải làm:

  • Đối với 404 xử lý thích hợp, bạn có ErrorDocument chuyển hướng trong cấu hình vhost. Tôi trông như thế này: ErrorDocument 404 /404.php;
  • Khi có 404, Apache sẽ gọi /404.php với tất cả các đối số (URL không hợp lệ, v.v., hãy đổ $_SERVER để xem điều này). Bạn phải kiểm tra nếu chỉ có hai biểu thức trong URL / ví dụ http://mysite.com/(expr1)/(expr2)/
  • Nếu không, sau đó làm một cổ điển 404.
  • Nếu có thì thực hiện tìm kiếm SOUNDEX với MySQL (trong tập tin 404 Php của bạn). Xem mẫu truy vấn here.
  • Sau đó, trong trường hợp 404 "đặc biệt" này, hãy thực hiện một đề xuất, chẳng hạn như google, tức là: "ý của bạn là /action/story-name-action/? Nếu có, hãy nhấp vào liên kết".

Đây là một công việc khó khăn, nhưng nó vừa thú vị vừa thể hiện kỹ năng của bạn. Rất ít trang web làm điều này (tôi chỉ biết google thực sự).

Dưới đây là một bản demo trên bảng tiếng Pháp của tôi có thể cung cấp cho bạn một cái nhìn tổng quan về cách hoạt động:

mysql> SELECT * FROM job WHERE 
SOUNDEX(description) LIKE SOUNDEX('Machiniste cinéma'); 
+-------+--------------------+ 
| id | description  | 
+-------+--------------------+ 
| 14018 | Machiniste cinéma | 
+-------+--------------------+ 
1 row in set (0.06 sec) 

mysql> SELECT * FROM job WHERE 
SOUNDEX(description) LIKE SOUNDEX('Mchiniste cinéma'); 
+-------+--------------------+ 
| id | description  | 
+-------+--------------------+ 
| 14018 | Machiniste cinéma | 
+-------+--------------------+ 
1 row in set (0.06 sec) 

mysql> SELECT * FROM job WHERE 
SOUNDEX(description) LIKE SOUNDEX('Machnste cinema'); 
+-------+--------------------+ 
| id | description  | 
+-------+--------------------+ 
| 14018 | Machiniste cinéma | 
+-------+--------------------+ 
1 row in set (0.06 sec) 

mysql> 
+0

Soundex được thiết kế để phân tích ngôn ngữ tự nhiên - nó có lợi thế là đi kèm với mysql ra khỏi hộp, tuy nhiên con số có ý nghĩa rất cụ thể trong âm thanh, và không phải chữ số không được xử lý bởi nó (cái gì "@? /!" âm thanh như thế nào?) – symcbean

+2

Bạn nói đúng. Tôi vừa đề xuất giải pháp duy nhất gần nhất với những gì natalia muốn. Và điều cô ấy muốn gần như không thể làm được. –

+0

Soundex là _wrong_ algo ở đây vì nó nhằm mục đích đạt được sự bất biến ngữ âm. Những gì bạn cần là Typex; -? - đó là một lỗi đánh máy lỗi thời, và đó hoàn toàn là một thước đo khác: tức là một từ trong một chữ cái URL hoặc một chuyển đổi QWERTY khác với một trong một danh sách các từ đã biết. Có thể có một số thuật toán mã nguồn mở liên quan đến các chức năng kiểm tra lỗi chính tả (ví dụ: trong Openoffice.org) có thể là điểm bắt đầu, nhưng đây sẽ là một nỗ lực nhiều tháng cho tác động tầm thường tới các lần truy cập - vì đồng bằng sẽ là% của các lỗi đánh máy trong đó người dùng không thử lại chính xác. – TerryE

0

Vì các giá trị (có lẽ) được lấy từ MySQL dựa trên tiêu đề, bạn có thể đặt chỉ mục FULLTEXT trên cột tiêu đề và sử dụng chức năng MySQL MATCH() để tìm kết quả phù hợp nhất và chuyển hướng người dùng đến .

Mặc dù điều này sẽ không có nghĩa là một giải pháp hoàn hảo - loại thông minh cần thiết để thực hiện việc này với bất kỳ mức độ chính xác thực nào đang che khuất một cách nguy hiểm gần lãnh thổ Turing test.

18

Trừ khi bạn rất chắc chắn về URL mà người dùng thực sự muốn điều hướng, sử dụng viết lại/chuyển hướng đến một URL cụ thể là một ý tưởng rất tồi. Lấy ví dụ của bạn, giả sử bạn muốn xử lý mọi trường hợp hai chữ cái có thể đã bị xóa, với 17 ký tự ở phần cuối cùng của URL, đó là 17 * 16 = 272 kết hợp, trong khi nó có thể khớp với nhiều các url 'sai' với một regex, bạn sẽ cần rất nhiều quy tắc viết lại.

Một giải pháp tốt hơn là, để triển khai trình xử lý 404 bằng cách sử dụng PHP (vì bạn đã bao gồm thẻ đó trong q), để tạo danh sách (10) URL hàng đầu có đường dẫn có khoảng cách ngắn nhất levenstein từ đường dẫn được yêu cầu , cùng với liên kết mặc định và văn bản hỗ trợ. (Có các triển khai dựa trên mysql - hãy thử Google cho URL). Trình xử lý NB vẫn phải trả lại trạng thái 404 - Nội dung HTML NB phải dài hơn độ dài tối thiểu để chặn thông báo lỗi 'thân thiện' của MSIE.

+0

+1 .. Tôi vừa mới viết rằng bản thân mình .. Có lẽ một cái gì đó giống như 'SOUNDEX' trên cấp độ MySQL có thể được sử dụng để tìm các URL tương tự. Hoặc các trang 'SELECT * FROM WHERE pageUrl SOUNDS LIKE userEnteredUrl'. – bummzack

4

Có một vài giải pháp:

  • Xác định nguồn gốc của các URL bị lỗi của. Điều này đơn giản không nên xảy ra, và tôi không thể tưởng tượng tại sao nó lại xảy ra. Có phải những người khác đang liên kết từ những nơi khác và họ đã mắc lỗi đánh máy (bỏ qua sự tồn tại của bản sao dán &)? Bạn có thể thấy nơi này đến từ đâu (referer) và liên lạc với họ không?
  • Thêm ID vào URL, vì vậy /action/123/story-name-action, nơi bạn tìm kiếm bài viết trên ID chứ không phải trên tiêu đề (tiền thưởng: thêm khả năng tạo nhiều câu chuyện cùng thể loại với cùng một tiêu đề)
  • fuzzy search trên tiêu đề, sử dụng một cái gì đó như soundex và chuyển hướng người dùng đến tiêu đề phù hợp nhất hoặc hiển thị trang tổng quan có tiêu đề giống như @symcbean gợi ý.

Tôi thích ID mặc dù.

1

Chúng tôi thiết lập chuyển hướng trang tìm kiếm của url như thế này - tìm kiếm của chúng tôi đã "gợi ý" tính năng.

7

Nếu bạn biết những gì đúng các URL có thể có thể, bạn có thể sử dụng:

levenshtein($givenURL, $possibleURL)

Ví dụ từ tài liệu PHP, nhận xét bị xóa cho ngắn gọn:

$input = 'carrrot'; 

$words = array('apple','pineapple','banana','orange', 
       'radish','carrot','pea','bean','potato'); 

$shortest = -1; 

foreach ($words as $word) { 
    $lev = levenshtein($input, $word); 
    if ($lev == 0) { 
     $closest = $word; 
     $shortest = 0; 
     break; 
    } 
    if ($lev <= $shortest || $shortest < 0) { 
     $closest = $word; 
     $shortest = $lev; 
    } 
} 

echo $shortest == 0 ? "Exact match found: $closest\n" : "Did you mean: $closest?\n"; 

Đầu ra:

Từ nhập: carrrot
Ý bạn là: cà rốt?

Điều này là tốt khi bạn cho rằng mọi người có thể đã bỏ qua một bức thư hoặc đặt thêm một chữ cái, nhưng nó có thể ngắn khi mọi người thực sự không biết đánh vần một từ và sáng tạo ra điều gì đó sáng tạo!

Nếu bạn thích tuyến đường soundex(), hãy xem hàm metaphone().

Tôi thích ý tưởng sử dụng metaphone() cùng levenshtein() hoặc similar_text() , vì nó trả về một đại diện ngữ âm của từ, và bạn vẫn muốn xem cách tương tự nó là gốc của bạn.

Ví dụ:

metaphone('name') = NM 
metaphone('naaaaaameeeeeeee') = NM 
metaphone('naiym') = NM 
metaphone('naiyem') = NYM 

Trong khi rất nhiều lỗi chính tả sẽ trả về một trận đấu giống hệt nhau, ví dụ cuối cùng cho thấy rằng bạn thực sự vẫn muốn tìm trận đấu gần nhất với cái gì đó như levenshtein()

Đối với hiệu quả, nếu bạn sử dụng một tập tin 404 khác, nơi viết lại đã cố gắng để phù hợp với mô hình này và thất bại, hơn bạn sử dụng cho phần còn lại của trang web, nó thực sự không nên thực sự là một chi phí lớn.

Nếu bạn nhận được cùng một 404 từ cùng một liên kết giới thiệu, (và không thể yêu cầu họ thay đổi liên kết), điều đó có thể đáng giá khi chỉ viết lại tĩnh trong trường hợp đó.

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