2014-11-28 3 views
1

동기 : 나는 내 자신의 간단한 CMS를 구축하고 있습니다. 그러나 내 게시물에 대한 htaccess를 할 때 URL에 전달 된 ID 뒤에 텍스트를 추가하려고 할 때 막혔습니다. 내가 지금까지 시도 무엇.htaccess 변수 뒤에 텍스트 추가

은 다음과 같습니다

RewriteRule ^blog/(.+)$ post.php?id=$1 

문제는 내가 http://example.com/blog/1에 입력 할 때 나는 게시물을 돌려받을 것입니다. 그러나 내가 http://example.com/blog/1/hello-world에 갈 때 그것은 작동하지 않는다. SEO 목적으로 permalinks에 추가 된 hello-world 텍스트를 원합니다.

답변

1

아래의 RewriteRule은 저에게 잘 작동합니다.

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule . /index.php [L] 
    </IfModule> 

그런 다음, $ _SERVER을 분할 할 수 있습니다 index.php를 내부 : 워드 프레스가하는 것처럼 htaccess로에서 정규식을 작성하는 것 외에도

RewriteRule ^blog/([0-9]+)/(.*)?$ blog_detail.php?id=$1&title=$2 [L] 
+0

내가 원하는 제목이 데이터베이스에서 검색되며이를 변수로 지정할 필요가 없습니다. – IdidntKnewIt

+0

@IdidntKnewIt하지만 그 반대의 경우가 있습니다.) 다시 올리기 규칙은 들어올 때 URI를 파싱하여 데이터베이스에서 제목을 얻습니다 (예제에서 'hello-world'부분)는 URI를 생성 할 때만 관련이 있습니다 (예 : 예를 들어 링크를 구성 할 때) – giorgio

+0

이 외에도 하나의 추가 사항 : 데이터베이스에서 고유 한 슬러그를 작성하고이 id를 생략하는 것을 고려해야합니다. '/ blog/1/hello-world'와 같은 url은 3 단계 URL이고'/ blog/hello-world'는 2 단계 URL입니다. 검색 엔진은 2 단계 URL을 더 중요하다고 생각합니다. 어쨌든 ID와 슬러그를 검사 할 때 id가 필요하지 않습니다 (내부적으로 필요하기 때문에 데이터베이스에서 열을 제거하지 마십시오) – giorgio

0

'못생긴'URL은 제목을 사용하지 않으므로 간단히 일치시킬 수는 있지만 무시하십시오. 현재 첫 캡처 그룹에 1/hello-world이 (가) 일치하고 있으며 post.php 페이지에서 분명히 처리 할 수 ​​없습니다. 대신 다음 내용을 일치 시키십시오.

RewriteRule ^blog/([^/]+)/[^/]+$ post.php?id=$1 [L] 

편집 : 누군가이 방법은 비효율적이라고 주장합니다. 나는 다를 것을 간청한다. PHP에서 다음을 수행하여 잘못된 URL을 사용하여 요청을 리디렉션 할 수 있습니다. $_GET['title']$expectedtitle을 비교 한 다음 URL을 구성하는 것만 큼 효율적입니다. 차이점은 주위에 쓸모없는 변수가 없으며이 코드의 의도가 명확하다는 것입니다. URL이 예상 URL이 아닌 경우 사용자를 리디렉션하려고합니다. 예상 제목이 실제 제목이 아닌 것은 부작용입니다.

$expectedtitle = getTitleById($_GET['id']); 
$expectedurl = "{$_GET['id']}/{$expectedtitle}"; 
if($_SERVER['REQUEST_URI'] != $expectedurl) { 
    header($expectedurl, TRUE, 301); 
} 
+0

그래서 난 그냥 $ – IdidntKnewIt

+0

전에 +를 추가하고 수정해야 당신이이 정말 조심해야/'때문에 것 블로그/1/hello-world' d'/ blog/1/bye-world'가 모두 일치하고 둘 다 동일한 게시물을 반환하므로 중복되는 콘텐츠가 생성됩니다 ... 다른 검색 가능한 URL에 대해 알 수없는 손가락을 교차시켜야합니다 – giorgio

+0

아니요 머리글에 표준 태그를 추가하여 공백이있는 게시물 제목을 '-'로 str_replace'd에 추가합니다. – IdidntKnewIt

1

, 당신은, 경로도 할 수 하나의 PHP 스크립트에 대한 모든 URL 부품 및 프로세스 [ 'REQUEST_URI'는] 당신은 다음과 같이 원하는대로 :

$parts = explode("/", $_SERVER['REQUEST_URI']); 
if($parts[1]==="blog") 
{ 
    $id = intval($parts[2]); 
    include("post.php"); 
    die(); 
} 
+0

또 다른 훌륭한 솔루션이지만, htaccess 재 작성을 통해 질문을 제안합니다. – IdidntKnewIt

+0

하지만 _is_ .htaccess는 다시 작성합니다. – giorgio

+0

@IdidntKnewIt - 예, 동의합니다. 난 당신이 자신의 CMS를 작성하는 것으로 나타났습니다, 그래서 아마도 PHP로 라우팅 논리를 복용하는 것이 .htaccess에서 항상 구성하는 것보다 더 편리 할 것입니다. 변경하는 것을 잊기 쉽고 설치하기가 더 어렵습니다. –