2010-07-26 2 views
5

모든 게시물 301 리디렉션을 리디렉션하고 싶지만 3000 개가 넘는 게시물이 있습니다..htaccess의 거대한 리디렉션 목록에 문제가 있습니까?

나는이 몇 가지 문제를 내 서버 자원을 먹거나 원인이 htaccess로의 명령을 리디렉션 URL을 3000 이상에 대한

Redirect permanent /blog/2010/07/post.html http://new.blog.com/2010/07/23/post/ 
Redirect permanent /blog/2010/07/post1.html http://new.blog.com/2010/07/24/post1/ 
Redirect permanent /blog/2010/07/post2.html http://new.blog.com/2010/07/25/post2/ 
Redirect permanent /blog/2010/07/post3.html http://new.blog.com/2010/07/26/post3/ 
Redirect per...... 

를 게시하면? Im .htaccess가 어떻게 작동하는지 모르겠지만 서버가 사용자가 페이지를 요청할 때마다이 목록을보고 있으면 리소스 호그가 될 것입니다.

새 URL에 날짜 변수를 추가했기 때문에 RedirectMatch를 사용할 수 없습니다. 이러한 게시물을 리디렉션하는 다른 제안 사항이 있습니까? 아니면 괜찮은거야?

감사합니다.

+0

404 페이지 -> JS를 통해 리디렉션. 그것은 예쁘고 작동합니다. – Warty

+6

@ItzWarty : 나는 그것이 끔찍한 충고라고해야 할 것입니다. JS가 켜져 있고 검색 엔진 스파이더에서 전혀 작동하지 않는다는 것을 보장 할 수는 없습니다. 404가 표시되고 콘텐츠가 사라 졌다고 가정합니다. 항상 오류 코드를 사용하여 코드가 실제로 의미하는 바를 말하십시오. – josh3736

답변

7

저는 Apache 전문가가 아니므로 .htaccess에서 3,000 개의 리디렉션이 문제가되는지 여부를 말할 수는 없습니다. (하지만 내 생각에는 나쁜 생각 일 수 있습니다.) 그러나 문제에 대한 간단한 해결책으로 mod_rewrite을 사용하여 리디렉션을 수행하는 것이 좋습니다.

RewriteRule ^/blog/(.+)/(.+)/(.+).html$ http://new.blog.com/$1/$2/$3/ [R=permanent] 

이렇게하면 정규식을 사용하여 이전 URL과 일치시키고 새 URL을 다시 작성합니다. [R=permanent]은 내부적으로 요청을 자동으로 다시 쓰지 않고 mod_rewrite가 새 URL로 301을 발행하도록 지시합니다.

예를 들어, 이전 URL에없는 URL에 게시물의 요일을 추가 한 것처럼 보입니다. 임의의 게시물이 작성된 날을 분명히하기 위해 정규 표현식을 사용할 수 없기 때문에이 방법이 효과가 없을 수 있습니다. URL에서 해당 날짜를 삭제할 수 있다면 가야합니다.

: 처음 질문을 읽었을 때 마지막 단락을 놓쳤습니다. ("새 URL에 날짜 변수를 추가했기 때문에 RedirectMatch를 사용할 수 없습니다.")이 경우 mod_rewrite의 RewriteMap을 사용하여 게시물의 날짜 구성 요소를 조회 할 수 있습니다.

  1. 정적 파일의 빠른 검색을 수행하기 위해 해시 맵을 사용

    당신은 두 가지 옵션이 있습니다. 즉, 이전 URL은 모두 작동하지만 이전 URL 스키마를 사용하여 새 게시물에 액세스 할 수는 없습니다.

  2. 스크립트를 사용하여 하루를 잡으십시오.
  3. 옵션 중 하나에서

,라는 파일 posts.txt을 만들어 넣어 :

/yyyy/mm/pppp dd 

을 ... yyyy는 게시물의 해 각 게시물에 대한 mm은 월, PPPP입니다 게시물 이름 (.html 제외).

이 완료

, 실행

$ httxt2dbm -i posts.txt -o posts.map 

그런 다음 우리는 서버/가상 서버 설정에 추가 :. (경로가 파일 시스템 경로가 아닌 URL 참고)

RewriteMap postday dbm:/path/to/file/posts.map 
RewriteRule ^/blog/(.+)/(.+)/(.+).html$ http://new.blog.com/$1/$2/${postday:$1/$2/$3}/$3/ [R=permanent] 

옵션 2에서 RewriteMap으로 pgm:/path/to/script/lookup.whatever을 사용하십시오. 스크립트 사용에 대한 자세한 내용은 mod_rewrite documentation을 참조하십시오.

you should never redirect more than once 때문에 날짜를 조회 한 다음 최종 목적지로 리디렉션하는 스크립트로 리다이렉트하는 것보다 mod_rewrite에서 조회하는 것이 낫습니다. 301 또는 302를 발행하면 왕복 비용이 발생하므로 페이지로드 시간이 길어집니다.

+0

감사합니다. 나는 당신의 제안을 시도 할 것이다. – Maca

+1

'RewriteMap'은 디렉토리 별 ('.htaccess') 컨텍스트에서는 정의 할 수 없으며 서버 또는 가상 서버에서만 정의 할 수 있습니다 (그러나 어디에서나 사용할 수 있음). 서버/가상 서버 구성을 변경할 수없는 경우 비슷한 대안은 'RewriteMap'과 본질적으로 동일한 스크립트로 다시 작성하는 것입니다. 또한 매우 철저한 답변 +1. –

+0

@Tim : 나는 그것을 워드 프로세서에서보고 싶었다. 지적 해 주셔서 고맙습니다. 답변을 업데이트했습니다. – josh3736

0

대규모 리디렉션 목록을 만드는 것은 결코 좋은 생각입니다. 보다 나은 프로그래밍 기법은 해당 날짜 변수가없는 페이지를 리디렉션 한 다음 누락 된 부분을 감지하고 포함 된 URL로 리디렉션하는 작은 PHP 스 니펫을 사용하는 것입니다. 긴 목록은 끈적 거리며 아파치의 속도를 떨어 뜨린다. 아파치는 URL (이 URL의 영향을받지 않는 다른 모든 URL)을 각 행에 대해 확인하기 때문이다. 5 명 정도면 좋겠지 만 3,000 명은 확실한 NO입니다.

나는이 방법의 큰 팬이 아니에요 만하는 더 나은 선택은 대시하거나 또는 모든 해당 URL 일반적으로 하나의 매치 문을 사용하여 리디렉션 날짜 부분 않고 페이지로 리디렉션하는 것 그런 다음 작은 PHP 스 니펫을 포함시켜 날짜가 유효한지 확인하고 그렇지 않은 경우 경로를 다시 올바르게 구성된 URL로 다시 작성하십시오.

솔직히, 당신이 전에 그 부분을 가지고 있지 않았다면, 당신은 지금 그것을 필요로하지 않을 것이고, 아마도 검색 엔진이 3,000 개의 게시물에 대한 URL을 변경하는 것을 혼란시킬 것입니다. URL에 날짜가 필요하지는 않지만 좋은 제목은 숫자뿐만 아니라 사용자뿐만 아니라 검색 엔진에도 훨씬 의미가 있습니다.

1

게시물의 날짜를 결정하는 코드가있는 경우 즉시 수정을 생성 할 수 있습니다. .html과 같은 mod_rewrite 패턴을 설정하고 front controller pattern을 설정하여 이전 URL에서 새 URL을 계산하고 301 헤더를 발행하십시오.

예를 들어 PHP를

:

$_SERVER['REQUEST_URI'] 

가 요청 된 URL을 포함하고

header("Location: http://new.blog.com/$y/$m/$d/$title/",TRUE,301); 

는 리디렉션을 보내드립니다.

1

그건 ... 많은 수의 리디렉션입니다. 하지만 내가 말할 것이고, 아마도 자격이 없다는 것을 말해 줄 수있는 유일한 방법은 테스트를 실행하고 블로그의 액세스 시간이 어떤지 확인하고 서버의 CPU 및 메모리 사용량을 살펴 보는 것입니다 네가하는 동안. 거대한 리디렉션 목록에도 불구하고 상당히 낮 으면 블로그에서 트래픽이 갑자기 증가하지 않는 한 괜찮습니다. (강력하게 3000 재 작성이 아파치의 속도를 늦추는 것으로 의심된다.)

그런데 나는 리디렉션을 동적 인 것으로 바꾸는 두 번째 조쉬의 제안을 원했다. animuson이 말했듯이 URL에서 하루를 빠져 나가려한다면 RewriteRule 지시어를 설정하여 리디렉션을 처리하기가 쉽습니다. 그렇지 않으면 PHP 스크립트 또는 일반적으로 사용 가능한 스크립팅 언어의 코드로 수행 할 수 있습니다. 인기있는 블로그 엔진 중 하나를 사용하고 있다면 이미이를 수행하는 코드가있을 것입니다. 기본적으로

RewriteRule .* /blog/index.php 

등의 작업을 수행 할 수 있으며 PHP 스크립트에서 요청 된 게시물을 분류하도록 할 수 있습니다. 데이터베이스에 액세스 할 수 있도록 데이터베이스에 액세스 할 수 있습니다. 그러면 PHP 스크립트에서 직접 게시물을 표시하거나 원래 리디렉션 동작을 복구 할 수 있습니다. 올바른 URL로 Location 헤더를 보낼 수 있습니다.

RewriteMap을 사용하는 대신 RewriteRule을 쓸 수 있습니다. 여기서 대상은 구성 파일에서 직접 지정하는 대신 원하는 프로그램이나 파일로 결정됩니다. 하나의 옵션으로 이전 URL과 새 URL을 포함하는 텍스트 파일을 지정할 수 있으며 Apache는 주어진 요청에 대해 적절한 줄을 찾기 위해 파일 검색을 처리합니다. 자세한 내용은 위의 링크 된 설명서를 참조하십시오. 나는 이것이 자주 사용되지 않는다는 것을 언급 할 것이고, 나는 3000 배의 리다이렉트를 갖는 것과 비교해 볼 때 얼마나 빨라지는지 확신 할 수 없다.

마지막 팁 : 구성 지시문 (예 : Redirect)을 서버 또는 가상 호스트 구성 파일로 이동하고 .htaccess의 읽기를 완전히 비활성화 할 수 있으면 Apache의 속도가 훨씬 빨라질 수 있습니다. .htaccess에서 3000 개의 지시문을 가상 호스트 구성으로 이동하면 서버를 상당히 빠르게 만들 수 있다고 생각합니다. 하지만 지시문을 가상 호스트 설정 파일로 옮기더라도 RewriteRule이라는 단일 명령을 사용하는 것보다 속도 향상을 얻을 수 없을 것입니다.

관련 문제