2010-08-09 8 views
0

나는이 주소에서 변경하려면 :.htaccess에서 어떻게 사용할 수 있습니까?

www.domain.com/game.php?id=1 

그런 식으로 뭔가를해야만하기 :

www.domain.com/game/1/THE-NAME-OF-THE-GAME-IN-DB 

내가 어떻게 할 수 있습니까?

그리고 하나 더 질문 :

가 나던 존재하는 경우 예를 들어, 사용자가 존재하는 나던 해결하기 위해 갈 때 내가 원하는 :

www.domain.com/game.php?id=9123912 - this ID doesnt exists 

서버가 404 오류로 그에게 전달합니다. 내가 어떻게 해?

대단히 감사합니다.

편집 :

game.php :

if (isset($_GET['id'])) { 

    $row = mysql_num_rows(mysql_query("SELECT * FROM games WHERE id = '{$_GET['id']}'")); 

    if ($row) { 
     $game = mysql_fetch_array(mysql_query("SELECT * FROM games WHERE id = '{$_GET['id']}'")); 
     Header("HTTP/1.1 301 Moved Permanently"); 
     Header("Location: /game/".$game['id']."/".seo_title($game['name'])); 
    } 

    else { 
     Header("HTTP/1.1 404 Not found"); 
    } 

    exit; 
} 

htaccess로 :

LIKE YOU SAID. I JUST COPIED. 
+0

를 참조 RewriteBase / 또는

RewriteBase /YOUR_SCRIPT_PATH_WITHOUT_HOST_NAME/ 같은 일도 할 RewriteBase을 설정할 수 있습니까? 그들은'game_title' 또는 뭐 아닌가요? –

+0

적어도 $ _GET [ 'id'] = intval ($ _ GET [ 'id']);와 함께 $ _GET [ 'id']을 (를) 위생해야한다는 점에 유의하십시오. –

+0

다른 SQL 호출이 필요하지 않습니다. 그냥 num 행 대신 배열을 가져 오지 않는 이유는 무엇입니까? –

답변

4

htaccess로

RewriteEngine On 
RewriteRule ^game/([0-9]+)/ /game.php?newid=$1 

game.php

if (isset($_GET['id'])) { 
    $row = dbgetrow("SELECT * FROM games WHERE id = %s",$_GET['id']); 
    if ($row) { 
    Header("HTTP/1.1 301 Moved Permanently"); 
    Header("Location: /game/".$row['id']."/".seo_title($row['name'])); 
    } else { 
    Header("HTTP/1.1 404 Not found"); 
    } 
    exit; 
} 

if (isset($_GET['newid'])) $_GET['id'] = $_GET['newid']; 

이 나를 위해 작동하지만 당신에게 아이디어를 제공하는 의사 코드로 간주 코드입니다.
dbgetrow() 함수는
및 seo_title() 함수는 전체 개념은 SO에서 슬쩍 된이 하나

function seo_title($s) { 
    $s = strtolower(trim($s)); 
    $s = str_replace(" ","-",$s); 
    $s = preg_replace('![^a-z0-9-]!',"",$s); 
    $s = preg_replace('!\-+!',"-",$s); 
    return $s; 
} 

처럼 될 수있는 데이터베이스에서 행을 얻을 :)
games/1/ 유일한 부분은 정말 나머지는 아무것도 될 수 있지만 게임 타이틀은 단지 서재응을위한 것입니다. 예를 들어이 질문에 제목을 가지고 :
How can I use in .htaccess?
을 :)

+0

안녕하세요, 첫 번째 - 감사합니다. 그것은 나를 통과시킵니다 - www.domain.com/game// - 왜? 이 $ newid는 무엇입니까? 감사합니다. – Luis

+0

+ 두 번째 "if"이유는 무엇입니까? – Luis

+0

@Luis이 코드는 저에게 효과적이지만 아이디어를주기위한 의사 코드로 간주됩니다. 'dbgetrow()'함수를 데이터베이스 조회와 실제 변수를 자신의 필드 이름으로 대체하십시오. $ newid는 오래된 서지와 새로운 서지 링크를 엉망으로 만들지 않습니다. onse 스크립트는 $ _GET [ 'newid']를 얻습니다. 이는 새로운 링크로 호출되었음을 의미합니다. $ _GET [ 'id']를 사용하면 이전 game.php? id = 1 링크로 호출되었으므로 올바른 새 주소 인/game/1/THE-NAME-OF-THE-GAME- IN-DB' 그것을 만들기 위해서는 주소 템플릿에 DB –

0

htaccess로는 당신이 언급처럼 URL 재 작성을 수행하는 것은 아닙니다. 서버가 아파치를 실행중인 경우 this을 시도하십시오. 서버가 IIS를 실행중인 경우 this을 시도하십시오.

두 번째 질문에 대해서는 id가 존재하지 않으면 game.php가 (9123912.html과 같이) 존재하지 않는 페이지 이름으로 리디렉션을 수행하도록하십시오. 서버는 네이티브 404를 전달하도록 구성되어야합니다.

+0

나는 그가 무엇을 원하고 있는지 정확히 확신한다 * 정확히 어떤 URL 재 작성이 일반적으로 사용되는지 - 그는 단지 거꾸로 언급했다. –

0

가 아마 가장 좋은 방법은 아래 코드와 같은 URL을 수정 페이지를 리디렉션하는 것입니다 (나를 위해 일)

if (isset($_GET['id'])) { 
$script_url = "http://localhost/scripts/myscripts/"; 
    $row = dbgetrow("SELECT * FROM games WHERE id = %s",$_GET['id']); 
    if ($row) { 
    Header("HTTP/1.1 301 Moved Permanently"); 
    Header("Location: ".$script_url."/game/".$row['id']."/".seo_title($row['name'])); 
    } else { 
    Header("HTTP/1.1 404 Not found"); 
    } 
} 

과에 있습니다.htaccess로 파일은 또한`id`하고 테이블에`name` 열이 있습니까도 Apache Doc

관련 문제