2011-03-14 3 views
1

이 정규식이 .htaccess 파일에서 작동하지 않는 이유를 이해하려고합니다. 사용자가 job_wanted.php?jid=ID으로 갈 때마다 job/ID으로 이동합니다..htaccess 파일의이 정규 표현식에 어떤 문제가 있습니까?

무엇이 문제입니까?

RewriteEngine On 

RewriteCond %{QUERY_STRING} jid=([0-9]+) 
RewriteRule ^job_wanted\.php?$ job/%1? [R] 

나는 사용자가 http://localhost/jobwehave.co.za/jobs/ID 클릭 그렇게 할 때 그들이 http://localhost/jobwehave.co.za/jobs?id=ID을 보여줄 것이다 아래 것과 동일한 결과를 나타내합니다.

죄송합니다. 나는 아직도 어떻게 작동하는지 매우 혼란 스럽다.

+1

사용자가'/ job/42'와 같은 RESTful URL을 입력 할 수 있지만 응용 프로그램에서'job_wanted.php? jid = 42'로 볼 수있게하려면? –

+0

나는 그것이 내가 원하는 것이라고 생각한다. 기본적으로 사용자가 http : //localhost/jobswehave/job_wanted.php? jid = 42와 같은 링크를 클릭하면 url이 http : // localhost/jobswehave/job/4 – Aaron

+0

음으로 재 작성되고 내 의견과 충돌합니다. ** 어떤 URL 스타일을 사용자가 자신의 URL 표시 줄에 보이게 하시겠습니까? ** –

답변

2

가장 큰 문제는 RewriteRule의 일부로 쿼리 문자열을 일치시킬 수 없다는 것입니다. 해당 부분을 RewriteCond 문으로 이동해야합니다.

RewriteEngine On 
RewriteCond %{QUERY_STRING} jid=([0-9]+) 
RewriteRule ^job_wanted\.php$ /job/%1? 

업데이트 된 질문을 반영하여 편집하십시오. 여기에 나와있는 것과는 반대입니다.

RewriteEngine On 
RewriteRule ^/job/([0-9]+)$ /path/to/job_wanted.php?jid=$1 

하지만 당신은 아마 문제 루트를 제외하고 어디서나 .htaccess 파일이 퍼팅을해야 할 것, 그리고 어쩌면있어 : 반대를 들어, PHP 스크립트가 소비 할 수있는 무언가로 /job/123을 변환, 당신이 원하는 것 그곳에. 루트에서 작동하는 경우 여기에 표시되는 RewriteRule에서 선두 /을 제거해야 할 수 있습니다.

두 번째 편집 의견을 반영하기 위해 : 나는 당신이 원하는 것은 복잡하다 생각하지만, 문제가 해결 될 수 있습니다

RewriteEngine On 
RewriteRule ^/job/([0-9]+)$ /path/to/job_wanted.php?jid=$1 [L] 

RewriteCond %{QUERY_STRING} jid=([0-9]+) 
RewriteRule ^job_wanted\.php$ http://host.name/job/%1? [R] 

귀하의 근본적인 문제는 아마도 당신의 통제에서 "수정"기존 링크를 원하는 것입니다 . 브라우저 주소 표시 줄의 URL을 변경하려면 브라우저를 리디렉션해야합니다. 다른 방법으로는 할 수 없습니다.

두 번째 cond + 규칙은 수신 대기하는 이전 URL과 일치하고 예쁜 URL 형식으로 리디렉션합니다. 이 중 하나는 VirtualHost 구성 블록이나 PHP 스크립트와 동일한 디렉토리에있는 .htaccess 파일에 있어야합니다.

첫 번째 규칙은 반대의 역할을합니다. 예쁜 URL을 Apache에서 사용할 수있는 것으로 다시 변환하지만 내부 하위 요청을 사용하면 다시 작성을 다시 시도하지 않습니다. 그렇다면 무한 루프가 발생합니다. 작동하면 작업 ID에 대한 쿼리 문자열 매개 변수가있는 PHP 스크립트가 호출되고 페이지가 계속 작동합니다. 이 규칙은 존재하지 않는 파일 시스템 경로가 다른 것으로 가정하기 때문에 VirtualHost 블록 또는 다른 루트 인에있는 .htaccess 파일에 있어야합니다.

다른 곳에서 구성을 확산시키는 것은 나에게 향후 문제가 될 수있는 처방처럼 들리지만 권장하지 않습니다. 당신이 제어 할 수있는 링크를 예쁜 버전으로 변경하고 다른 링크는 걱정하지 않는 것이 좋을 것 같습니다.

+0

OP는 문제를 거꾸로 말했습니다. 그는 RESTful 스타일의 URL을 사용하려고합니다. 내 대답을 한번 보아라. 나는 제대로했다고 생각한다. (그러나'mod_rewrite'에 익숙하지 않다. ;-). –

+0

여전히 나는 클릭 할 때 로컬 호스트/jobswehave/job_wanted.php? JID =이 localhost로 나를 취 (42) 링크/jobswehave/job_wanted.php? JID =이 URL이 내가 가지고/42 로컬 호스트/jobswehave/작업처럼 보이게 아니에요 (42) 사용자가 로컬 호스트에서 결과를 보여주는 것/jobswehave/작업을 localhost로 간다 이렇게하면 다른 RUL/jobswehave/jobs.php – Aaron

+0

당신이 달성하려고하는지 이해한다면 @Matthew이, 당신이 혼란스러워 생각합니다. 재 작성의 중요한 점은이 것없는 *** 할 ***'로컬 호스트/jobswehave/job_wanted.php? JID = 42'처럼 보이는 링크를 클릭. 브라우저의 모든 링크는'localhost/jobswehave/job/42'처럼 보일 것입니다. –

1

?과 같은 특수 문자를 이스케이프 처리하려고 했습니까?

+0

예 \ – Aaron

1

?. 문자는 정규식에서 특별한 의미가 있습니다. 당신은 아마 그들을 탈출 할 필요가있을 것입니다.

또한 jid 값을 캡처하여 규칙에 사용해야합니다.

이에 규칙을 변경하려고 : 당신이 그 될 리터럴을 원하는 경우

RewriteEngine On 
RewriteRule ^job_wanted\.php\?jid=([0-9]+)$ /job/$1 
+0

와 함께 이스케이프 처리를 시도했습니다. 'RewriteRule'은 쿼리 문자열과 일치 할 수 없습니다. http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule을 참조하십시오. –

1

당신은 ?.마르크을 탈출해야합니다.

^job_wanted\.php\?jid=9\?$ 

하지만 패턴이 일치하지 않는 이유가 설명되어 있지만 URL 재 작성 문제는 해결되지 않습니다. ^$이있는 이유는 대부분의 URL과 일치하지 않기 때문입니다 (예 : http://www.yoursite.com/job_wanted.php?jid=9은 job_wanted.php로 시작하지 않기 때문에 작동하지 않음).

htaccess를 잘 모르므로 질문의 정규식 부분 만 처리 할 수 ​​있습니다. 전통적인 정규식 구문에서는 다음과 같은 것을 찾으려고합니다.

s/job_wanted\.php\?jid=(\d*)/job\/$1/i 

희망이 있습니다.

1

정규식에서 작업 ID를 캡처하지 않았으므로 다시 작성한 URL에서 참조 할 수 없습니다. 이런 식으로 뭔가 (테스트하지,주의의 위험 부담은 등 위 고통을 일으킬 수) :

RewriteRule ^job/([0-9]+) job_wanted.php?jid=$1 

이에 튜토리얼 Start Rewriting를 참조하십시오.

1

^은 문자열의 처음에 정규식을 고정합니다.

RewriteRule (이것은 일부 디렉토리 별 구성 영역에서 않는 한)이 URI /을 시작 일치합니다.

하나는 / 접두사 또는 (당신이 달성하려는 작업에 따라) 앵커 ^ 트릭을 할해야

ReWriteRule ^job\_wanted\.php\?jid\=([0-9-]+)$ /job/$1 

같은

+0

그는이 파일이'.htaccess' 파일에 있다고 말했기 때문에 아파치는'/'까지 이어지는 디렉토리 경로를 제거 할 것입니다. –

+0

그럴 경우 나는 틀렸다. –

관련 문제