2011-01-21 3 views
1

나는 다음과 같은 문제를 해결하는 데 사용해야하는 단계와 개념 (특정 코드와 반대)을 얻길 원합니다.Mod_Rewrite 데이터베이스 쿼리를 기반으로

개인 프로필을 제공하는 LAMP 사이트는 현재 www.site.com/profile.php?id=user_id으로 제공됩니다. 대신 나는 www.site.com/uniqueusername을 원합니다. .htaccess 개조에서 여러 스레드를 읽었지만 제 경우는 조금 다릅니다.

  1. 사용자 요청이
  2. 서버는 데이터베이스를 쿼리 www.site.com/username와 USER_ID 해당
  3. 서버에 사용자 이름과 일치 www.site.com/ 다시 보냅니다 내가 달성하기 위해 필요하면은 다음과 같다 profile.php? id = 올바른 user_id가 별명 (www.is.com/username) 인 경우

사이트는 현재 사용자와 일치하는 로그인의 고유 식별자 신분증. 사용자 프로필 페이지의 URL에 사용되는 등록 중에 사용자 이름 필드를 추가하고 싶습니다.

앞서 말했듯이 위에 설명한 작업을 수행하는 데 필요한 개념과 단계에 대한 도움은 크게 감사하겠습니다.

+0

귀하의 사이트가 사용자 페이지가 아닌 다른 페이지가됩니다 PHP 스크립트에서

, 그것은 간단하다? 그렇다면 루트 네임 스페이스 – Brian

답변

4

.htaccess 파일에 대한 전문가는 아니지만 어쨌든이 솔루션이 최선의 해결책이 아니더라도이 작업을 어떻게 수행하는지 설명 할 수 있습니다.

먼저 profile.php? u = username과 같은 형식으로 사용자 ID 대신 사용자 이름을 수락하는 방식으로 profile.php 파일을 만들어야합니다. 이것은 나에게 불필요하기 때문에 2 단계를 피하는 것입니다 (사용자 이름이 고유하지 않으면 사용자 ID를 쿼리 할 필요가 없습니다). 요청 된 경로가 기존 파일이나 디렉토리가 아닌 경우

, 당신은 처음 두 조건을 확인

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule ^([a-zA-Z0-9]+)/$ profile.php?username=$1 

같은 간단한 htaccess로 규칙을 작성, 다음 규칙은 이전 상태 인 경우 (URL을 다시 작성 , 내가 만든 모든 요청 끝에 슬래시를 추가하는 다른 규칙을 사용하기 때문에 내가 후행 슬래시를 입력

참고) 물론 거짓 (이 뒤를 방지하는 것입니다 서로 다른 페이지 하나를 가지고 있고 하나는 슬래시 인 plicate 컨텐츠). 이것은이다 :

물론
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !(.*)/$ # check if the URL already ends with a slash 
RewriteRule ^(.*)$ http://website.com/$1/ [L,R=301] 

필요한 경우 다른 조건을 추가해야 할 수도 있습니다,하지만이 문제

+1

Jack을 연결하는 대신 하위 디렉토리에 사용자를 배치하는 것이 좋습니다. 답변을 많이 주셔서 감사합니다. 내가 정말로 고맙게 여기는 코드를 고맙게 생각하는 한, 나 자신을 강박하려는 이유는 사용자 이름이 user_id만큼 독특하다는 생각이었습니다. 그래서 단순히 username에서 실행하기 위해 profile.php 페이지를 변경하지 않는 것이 좋습니다. 대신. 나는 문제의 코드에 너무 빠져서 문제에 대해 합리적으로 생각하는 것을 완전히 무시했다. 다시 한번 감사드립니다. 당신은 큰 도움이되었습니다. 2 시간의 뇌 붕괴는 10 분 이내에 해결됩니다. 이 사이트는 매우 귀중한 사이트입니다. 다시 한번 감사드립니다. – Michael

+0

나는이 대답이 좋은 기술을 지적하면서 지나치게 복잡하고 불필요한 구성 요소가 있다고 생각한다. URL은'http : // www.site.com/username'이어야하며 뒤에 슬래시는 사용하지 마십시오. (위에서 지정한대로). 따라서 'RewriteCond'및 301 리디렉션이 필요하지 않습니다. – gahooa

+0

@ 마이클 : 천만에, 가능할 때 도와 줘서 다행입니다. @gahooa : 글쎄요, 그렇습니다. 사용자가 site.com/username 대신 site.com/username/에 액세스하려고하면 404 오류가 발생하지 않도록하기 위해서입니다. 이 코드는 여러분이 정확하다고 두 버전 인 –

1

당신이 알고 일단이 (매우 간단한 문제에 좋은 일반적인 접근 것 같다 단계).

mod_rewrite이 로컬 URL에 요청을 다시 쓰면 기본 동작은 내부적으로 수행하는 것입니다. 이 규칙에 따라서

는 :

RewriteEngine on 
RewriteRule ^/([a-zA-Z0-9]+)$ /profile.php?id=$1 

자동으로 전달 된 ID를 캡처 /profile.php해야합니다.

웹 클라이언트 (예 : 브라우저)가 더 현명하지 않으므로 PHP 스크립트에서 반환 한 내용은 바로 앞으로으로 보내야합니다.

사용자가 PHP를 사용하고 있다는 것을 알지 못합니다 (헤더를 보내지 않아도 보이지 않는 경우).

<?php 
    $id = trim(isset($_GET['id']) ? $_GET['id'] : ''); 

    if(empty($id)) 
    { 
     die('User not found'); 
    } 

    // look up in db, etc... 
    // render page 
+0

Gahooa, 정말 고마워요. 학습 경험을 위해서만 두 가지 제안을 모두 시도해 볼 것이라고 생각합니다. – Michael

관련 문제