404를 유사한 URL로 리디렉션
나는 그 안에 이야기가 있는 웹사이트가 있습니다.다음과 같은 여러 범주 내의 여러 유형의 이야기를 가질 수 있습니다.
- 아이들.
- 로맨스
- 시피
- 액션.
- 스릴러
- 퀘스트들
다음과 같은 URL을 사용하여 스토리에 접근할 수 있습니다.
www.example.com/action/story-name-action/
www.example.com/romance/story-name-romance/
첫 번째 매개 변수(action)와 두 번째(story-name-action)는 규칙을 사용하여 .htaccess로 리디렉션됩니다.이 부분은 잘 작동합니다.
최근에 저는 다양한 사이트에서 404를 몇십 개씩 받고 있는데 제가 하고 싶은 일은 다음과 같습니다. 하지만 어떻게 해야 할지 모르겠습니다.
입력하는 :/action/story-nme-ction
으로 리디렉션합니다. , (으)로 .action/story-name-action/
이를 구현할 수 있는 효율적인 방법이 있습니까?
세상에, 세상에!
여러분이 요구하는 것은 간단하지 않고 강력한 컴퓨터를 필요로 하지만 결과는 그저 놀라울 뿐입니다.
제가 제안하는 것은 다음과 같습니다.
- 는 404 가 있습니다
ErrorDocument
vhost 구성의 리디렉션. 생겼어요.다.ErrorDocument 404 /404.php
; - 는 404 입니다를
/404.php
모든 어떤 수쁜 URL등,프)와 )$_SERVER
이것을 보기 위해서). URL다에 두 개만 ./
,예http://mysite.com/(expr1)/(expr2)/
- 그렇지 않다면 클래식 404를 하시오.
- 예인 경우 MySQL로 SOUNDEX 검색을 수행합니다.
404 Php
파일). 여기 쿼리 샘플을 참조하십시오. - 그런 다음, 이 "특별한" 404 사례에서 Google이 하는 것처럼 제안을 수행합니다. 즉:"당신 말은
/action/story-name-action/
그렇다면 링크를 클릭합니다."
이것은 힘든 일이지만, 흥미롭고 당신의 실력을 보여줍니다.이것을 하는 웹사이트는 거의 없습니다. (저는 구글을 실제로 알고 있을 뿐입니다.)
다음은 제 프렌치 테이블의 데모로 작동 원리를 간략히 보여드리겠습니다.
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>
사용자가 탐색하고자 했던 URL이 확실하지 않다면 특정 URL로 다시 쓰기/방향 전환을 사용하는 것은 매우 좋지 않은 생각입니다.
예를 들어, URL의 마지막 부분에 있는 17자의 조합으로 두 글자가 삭제된 모든 경우를 처리하고 싶다고 가정해 보겠습니다. 17*16 = 272개의 조합으로 여러 개의 'false' URL을 일치시키는 것은 가능하지만, 여전히 많은 재작성 규칙이 필요할 것입니다.
PHP를 사용하여 404 핸들러를 구현하는 것이 더 나은 해결책이 될 것입니다. (당신이 그 태그를 q에 포함시켰기 때문에), 요청된 경로에서 가장 짧은 레벤슈타인 거리를 가진 경로를 기본 링크 및 지원 텍스트와 함께 상위 10개의 URL 목록을 생성하는 것입니다.(mysql 기반 구현이 있습니다. URL은 Google에서 확인해 보십시오.)NB 핸들러는 여전히 404 상태를 반환해야 합니다. MSIE의 '친화적' 오류 메시지를 억제하려면 NB HTML 내용이 최소 길이 이상이어야 합니다.
가능한 올바른 URL이 무엇인지 알고 있다면 다음을 사용할 수 있습니다.
levenshtein($givenURL, $possibleURL)
간단한 설명을 위해 PHP 문서에서 제거된 주석의 예:
$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";
출력:
입력어 : 당근
당근 말입니까?
이것은 사람들이 글자를 생략하거나 여분의 글자를 넣었을 수도 있다고 생각할 때 좋지만, 사람들이 단어의 철자를 정말로 모르고 창의적인 것을 생각해냈을 때 부족할 수도 있습니다!
경로가 마음에 드신다면, 기능을 한 번 보세요.
사용하는 아이디어가 마음에 듭니다.metaphone()
나란히levenshtein()
아니면 , 그것이 단어의 음성적인 표현을 반환하고, 당신은 그것이 당신의 원본과 얼마나 유사한지를 아직도 보고 싶어합니다.similar_text()
예:
metaphone('name') = NM
metaphone('naaaaaameeeeeeee') = NM
metaphone('naiym') = NM
metaphone('naiyem') = NYM
많은 철자 오류가 동일한 일치를 반환하지만, 마지막 예는 당신이 여전히 다음과 같은 것과 가장 가까운 일치를 찾고 싶어한다는 것을 보여줍니다.levenshtein()
효율성을 위해 재작성이 이 패턴과 일치하려고 시도했다가 실패한 다른 404 파일을 나머지 사이트에 사용하는 것과 달리 사용하는 경우에는 큰 오버헤드가 발생하지 않아야 합니다.
동일한 레퍼러로부터 동일한 404를 많이 받는 경우(링크를 변경하도록 할 수 없는 경우) 해당 경우 정적 재작성을 입력할 가치가 있을 수 있습니다.
다음과 같은 몇 가지 해결책이 있습니다.
- 결함이 있는 URL의 출처를 확인합니다.이런 일이 발생해서는 안 되고, 왜 이런 일이 일어나는지 상상할 수가 없습니다.다른 사람들이 다른 곳에서 링크를 하는데 오타를 냈나요(복사 및 붙여넣기의 존재를 무시)?이것이 어디서 오는지(레퍼)를 보고 연락할 수 있습니까?
- URL에 ID를 추가합니다.
/action/123/story-name-action
, 제목이 아닌 ID로 기사를 조회하는 경우(보너스: 동일한 제목으로 동일한 카테고리의 여러 스토리를 생성할 수 있는 가능성 추가) - soundex 같은 것을 사용하여 제목에 대해 퍼지 검색을 수행하고 사용자를 가장 적합한 제목으로 리디렉션하거나 @symcbean이 제안하는 것과 같은 제목과 유사한 개요 페이지를 표시합니다.
그래도 신분증이 더 좋아요.
url에 대한 검색 페이지로 리디렉션을 설정합니다. 검색에 "제안된" 기능이 있습니다.
제목을 기준으로 MySQL에서 값을 끌어오기 때문에 다음을 입력할 수 있습니다.FULLTEXT
제목 열에서 색인을 만들고 MySQL 함수를 사용하여 가장 관련성이 높은 일치 항목을 찾은 다음 사용자를 해당 항목으로 리디렉션합니다.
이것이 결코 완벽한 해결책은 아니겠지만 - 실제 정확도를 가지고 이것을 하는 데 필요한 지능의 종류는 튜링 테스트 영역에 위험할 정도로 가까이 접근하고 있습니다.
언급URL : https://stackoverflow.com/questions/8941433/redirect-404-to-similar-urls
'programing' 카테고리의 다른 글
람다 함수와 중첩 함수('def') 중 어느 것을 사용하는 것이 더 좋습니까? (0) | 2023.09.28 |
---|---|
R의 MySQL에서 UTF-8 텍스트를 가져오면 "???"가 반환됩니다. (0) | 2023.09.28 |
문자열 보간 대 문자열.서식 (0) | 2023.09.28 |
동일한 테이블에 여러 인덱스를 동시에 만들 수 있는 데이터베이스가 있습니까? (0) | 2023.09.28 |
Piwik 사용자 정의 변수별 필터 그래프 (0) | 2023.09.28 |