2012-01-23 2 views
0

새 클라이언트에 대한 새 웹 사이트 시작.간단한 mod_rewrite 지저분한 레거시 URL에 대한 RewriteRule

example.com/products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription

example.com/products.aspx?category=Foo&product=ProductNameDescription&var1=1293.123

example.com/products.aspx?category=Bar&product=ProductCategoryProdNameRandomNumbers

:

올드 URL의 예를 자신의 이전 사이트는 약 50 제품을 가지고 불행하게도, 이전 제품 이름은 새로운 URL 패턴에 일치하지 않습니다

(이전 URL은 150자를 초과하는 경우가 있습니다.)

,210

새로운 URL의 :

example.com/products/category/actual-product-name

정해진, 새로운 일에 이전 제품 이름에서 갈 인식 패턴이 없습니다. 카테고리가 있습니다.

간단한 mod_alias Redirects를 시도했지만 대신 RewriteRule이 필요하다는 것을 이해했습니다. 하지만 문제가 있습니다. 내가 필요한 것은이 50 개의 URL 각각에 대해 일대일 리디렉션입니다. 나는 다음과 같이 할 수있을 것이라고 생각했다 :

RewriteRule ^/products.aspx?category=Foo&product=ProductName 
    /products/category/new-product-name/ [R=301,NC] 

그러나 그것은 작동하지 않는다. 나는 이것이 단순해야한다는 것을 알고 있지만, 나는 붙어있다. 어떤 아이디어?

+0

정확히 작동하지 않는 것은 무엇입니까? – Jonathan

+0

좋은 양식의 경우 마침표를 빠져 나와야합니다. 'products \ .aspx'. 또한 RewriteCond에 대한 아래의 답변을 참조하십시오. 나중에 .htaccess에 다시 쓰인 URL에 영향을 줄 수있는 다른 RewriteRules가 있습니까? 외부 리다이렉션을 할 때'L' 플래그를 사용하고 싶을 수도 있습니다. – JMM

+0

응답 JMM에 감사드립니다. 다른 다시 쓰기 규칙은 없습니다. 나머지 사이트는 단순한 리디렉션으로 처리 할 수 ​​있습니다. 외부 리디렉션도 없습니다. –

답변

1

나머지 리디렉션 ur 그렇소. 예를 들어 특수 문자를 이스케이프 처리합니다. 그

RewriteEngine on 
RewriteBase/

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /products\.aspx\?category=Foo&product=SuperLongNoBreakProductNameIDDescription [NC] 
RewriteRule^/products/category/new-product-name/ [R=301,NC] 
+0

명백한 (더 복잡한)'% {QUERY_STRING} '을 사용하지 않는 경우 +1 – Gerben

+0

답변 해 주셔서 감사합니다. 이 방법은 효과가 있지만 URL에 문제가 있습니다. '/ products/category/new-product-name /? category = Foo & product = SuperLongN ...'로 표시됩니다. 거래가 아니라 수수께끼입니다. 또한 RewriteBase를 사용하지 않고 있습니다. 가상 호스트에 직접 넣어야하기 때문입니다. –

+0

@the_zero 원래 검색어 문자열 인 'RewriteRule ^/products/category/new-product-name /?'을 표시하지 않으려면 끝에 '?'를 추가하십시오. [R = 301, NC]' –

0

RewriteMap 지시어 (mod_rewrite)를 살펴보십시오.

products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription /products/category/new-product-name 

그리고 당신의 httpd.conf

RewriteMap productmap /path/to/map/file.txt 
RewriteRule ^(.*) ${productmap:$1} [R=301,NC] 

팁에서 :

당신은 같은 텍스트 파일 무언가를 지정할 수 있습니다 당신이 원하는 영구 리디렉션의 경우, 사용자가 설정 확인 적절한 Cache-ControlExpires 헤더가 브라우저에 301을 캐시하도록 지시합니다.

+0

경로에 쿼리 문자열이 없으므로 Ulrich의 솔루션과 결합하십시오. – Gerben

0

앞에 \을 추가하여 ?, . 공간 당신은 이런 식으로 뭔가를 시도 할 수 있습니다 :

RewriteEngine On 

RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$ 

RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L] 

참고 :

에서
  1. 당 디렉토리 (. htaccess) 컨텍스트에서 dir 당 접두사가 제거되어 RewriteRule 패턴을 ^/으로 시작할 수 없습니다 .

  2. 쿼리 문자열과 일치 시키려면 RewriteCond을 사용해야합니다.

  3. 다른 답변에서 설명한 것처럼이 사이트에 대한 가상 호스트 정의 인 httpd.conf/vhost에 액세스 할 수 있다면 RewriteMap 솔루션이이 상황에 적합 할 수 있습니다. 비록 쿼리 문자열과 함께 작동하는지 모르겠습니다.

  4. 이와 같은 이유로 이러한 모든 URL을 서버 측 스크립트로 다시 작성하고 스크립트를 사용하여 각 URL에 대해 HTTP 리디렉션을 수행하는 것이 좋습니다.

관련 문제