2009-12-10 5 views
3

mod_rewrite를 사용하여 예쁜 URL을 Spring 2.5 애플리케이션에서 지원하는 양식으로 다시 작성하고 있습니다. mod_rewrite : 경로 및 쿼리 문자열 URL을 매개 변수로 전달하십시오.

e.g. /category/cat1?q=x => /controller?category=cat1&q=x 

그러나 내 컨트롤러에서 나는 요청이 온 원래의 URL을 (필요한 경우 내가 링크를 생성 할 수 있습니다) 알고 싶어요. 이 접근 방식은 일반적으로 모든 페이지에서 필요하므로 하드 코딩이 어렵습니다.

컨트롤러에서 원래 경로 + 쿼리 문자열에 액세스하려면 어떻게합니까?

$ 0을 사용하여 전체 경로를 포함 시키려고했지만 쿼리 문자열을 포함하지 않았습니다. 경로의 일부만 매개 변수로 추가되는 결과로 경로와 쿼리 문자열을 추가 할 수 없습니다. /category/cat1?category=cat1&q=x 원치 않는 &category=cat1 매개 변수가 추가되어 브라우저에서 보낸 URL이 더 이상 일치하지 않습니다. 내 원래의 예를 내 컨트롤러는 것에 통과 한 최종 결과를 사용

RewriteRule /category/(.+) 
      /controller?category=$1&_originalUrl=${escape:$0}?${escape:<original query string>} 
      [QSA] 

:

내가 바라고 있어요 mod_rewrite는이 같은 내 규칙을 볼 수 있었다 나 전체 URL을 참조 할 수 있도록하고 매개 변수로 인코딩합니다 :

/controller?category=cat1&_originalUrl=%2Fcategory%2Fcat1%3Fsearch%3Dx&search=x 

중요한 부분은 이스케이프 버전 /category/cat1?q=x (브라우저로부터 전송 된 원래의 요청 URL) 인 %2Fcategory%2Fcat1%3Fsearch%3Dx&_originalUrl되어야의 값이다.

의견을 보내 주셔서 감사합니다.

+0

http://tools.cherrypy.org/wiki/ModRewrite에서 이스케이프 기능 $ {escape : $ 1}을 (를) 발견했습니다. 이제 경로와 원래 쿼리 문자열을 추가하는 방법을 알아야합니다. $ {이스케이프 : $ 0} $ {이스케이프 : <원래 쿼리 문자열>} –

+0

원래 경로와 쿼리 문자열을 별도의 매개 변수로 수신하는 것이 적절한 솔루션입니다. 예 : & _originalPath = $ {이스케이프 : $ 0} & _ originalQueryString = $ {이스케이프 : <원래 쿼리 문자열>} <원래 쿼리 문자열>은 어떻게해야하는지 모릅니다. –

+0

안녕하세요, 해결하기 위해 비슷한 문제가있어,하지만 그것은 보인다 : 탈출 다시 쓰기 맵 트릭을하지 않습니다 : URL을 인코딩 (예 :/% 2F로, & 26 % 등), 그냥 문자 인코딩 URL에는 허용되지 않습니다. 마지막으로 볼 수있는 옵션은 외부 매핑 프로그램을 사용하는 것입니다. 그러나 더 많은 문제가 생기고 있습니다. 다시 작성한 URL에 "; original_qs = "를 추가합니다. – huelbois

답변

8

쿼리는 ONY 만 URL path을 테스트 않습니다 RewriteCondRewriteRule 이후로 테스트 할 수 있습니다. Jonathan Feinberg의 예를 참조하십시오.

그러나 당신은 또한 단지 QSA flag하고 기존 쿼리를 설정할 수 있습니다 자동으로 새에 추가됩니다 :

RewriteRule ^/category/([^/]+)$ /controller?category=$1 [QSA] 

편집        을이 질문에 대한 귀하의 의견에 대응 : 처음 요청한 URI 경로 및 쿼리를 가져 오려면 request line (THE_REQUEST 변수)에서 추출해야합니다.

RewriteCond %{THE_REQUEST} ^[A-Z]+\ ([^\s]+) 
RewriteRule ^/category/([^/]+)$ /controller?category=$1&_originalUrl=%1 [QSA] 

그러나 대부분의 언어에는 매우 동일한 정보가있는 환경 변수가 있습니다.

+0

QSA 사례에 감사드립니다. 죄송합니다. 예제가 정확하지 않아서 [QSA]를 사용하여 원래 쿼리 문자열을 다시 작성한 URL에 자동으로 추가했습니다. 달성하기 위해 노력하고있어 사용자가 브라우저에서 볼 때 원본 (unrewritten) 경로 + 쿼리 문자열을 얻고 내 컨트롤러에 인코딩 된 매개 변수로 전달합니다. –

+0

@richardpaul :이 경우 요청 줄에서 해당 정보를 추출해야합니다. 'RewriteCond % {THE_REQUEST}^[AZ] + \ ([^ \ s] +) RewriteRule ^/category/([^ /] +) $/controller? category = $ 1 & _originalUrl = % 1' – Gumbo

0

사용할 수있는 호스트 헤더가 있습니까? 너무 막연한 것에 대해 미안하지만, 마지막으로 PHP (urgh, dont ask)를 사용하는 것이 었습니다. REQUEST_URI (http://www.askapache.com/htaccess/mod_rewrite-variables-cheatsheet.html)

또한 다음과 같이 설정할 수 있습니다. 재 작성에 헤더를 호스트 (http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html)

예 :

ReWriteRule /category/(cat1)?q=(x) /controller?category=$1&q=$2 [E=FOO:....] 

(도없고, 정말 완전히하지 해요 모드 - 재 작성 닌자)

+0

답장을 보내 주셔서 감사합니다. 내 원래의 질문에. 호스트 이름, 원래 경로 및 쿼리 문자열과 관련이 없습니다. 그에 따라 질문을 업데이트했습니다. –

1

당신은에서 쿼리 문자열을 캡처해야 초기, 별도의 단계.

RewriteCond %{query_string} ^q=([^&]+) 
RewriteRule ^/category/(cat1)$ /controller?category=$1&q=%1 

+0

감사하지만 전체 쿼리 문자열을 캡처해야하며 일반 형식 (매개 변수가 전달되는 매개 변수가 무엇인지는 알 수 없음)이 있어야합니다. Gumbo의 제안에 따라 QSA를 사용하도록 예제를 업데이트했습니다. –

+0

올바른 답을 얻으려는 내 답변에는 충분한 정보가 있습니다. 행운을 빕니다. –

관련 문제