Apache mod_rewrite: URL에서 슬래시를 처리하는 방법은 무엇입니까?

Apache mod_rewrite: URL에서 슬래시를 처리하는 방법은 무엇입니까?

다음과 같은 URL 구조가 있습니다.

http://mysite.com/movies/index.php?id=123

index.php?id=123을 제거하고 대신 다음 URL을 사용하고 싶습니다.

http://mysite.com/movies/123

나는 /var/www/mysitecom/movies 디렉토리에 다음과 같은 .htaccess를 생각해 냈습니다.

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ mysitecom/movies/index.php?id=$1 [L,QSA]

그리고 그것은 작동합니다. 예를 들어, 내가 지정할 때 ...

http://mysite.com/movies/123

... 나는 얻다 ...

http://mysite.com/movies/index.php?id=123

내가 지정할 때 문제가 시작됩니다 ...

http://mysite.com/movies/123/

이 슬래시를 사용하면 URL이 제대로 처리되지 않습니다. ID를 전혀 지정하지 않은 것 같고 모든 CSS 스타일이 적용되지 않은 것 같습니다.

다음과 같은 규칙에서 정규 표현식을 사용해 보았습니다.

RewriteRule ^([^/]+)[/]*$ mysitecom/movies/index.php?id=$1 [L,QSA]

...하지만 도움이 되지 않았습니다.

내 질문은 내 경우 슬래시를 처리하는 방법입니다. 다시 쓰기 규칙을 선택해야 합니까, 아니면 다른 작업을 수행해야 합니까? 나는 그것을 보장해야한다http://mysite.com/movies/123/정확히 같은 방식으로 처리http://mysite.com/movies/123. 이견있는 사람?

감사해요,

업데이트:

사용자Dsumsky(아래) 나를 도왔습니다.

Dsumsky, 대답 해 주셔서 감사합니다. 나는 텍스트 형식을 지정하는 기능을 얻기 위해 답변 형식으로 댓글을 달기로 결정했습니다.

우선 로깅 활성화에 실패했습니다. 내 .htaccess에 이 문자열을 사용하면 ...

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

... 다음과 같은 오류가 발생했습니다.

Rewrite log not allowed here

글쎄, 나는 이 문자열을 /etc/apache2/apache2.conf에 넣고 아파치를 다시 시작했습니다. rewrite.log가 생성되었지만 다시 쓰기가 발생해도 비어 있습니다.

둘째, 다음 문자열이 없으면 전혀 작동하지 않습니다.

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f

그래서 나는 그것들을 추가했습니다. 그러다가 %{HTTP_HOST}에 문제가 발생하여 경로를 지정하여 조금 변경했습니다.

RewriteRule ^([^/]*)/?$ mysitecom/movies/index.php?id=$1 [L]

상황이 좋아졌습니다. 둘다http://mysite.com/movies/123그리고http://mysite.com/movies/123/ID가 적용된 것을 확인했습니다. 전자의 경우 모든 것이 완벽하지만 후자의 경우 CSS 스타일이 전혀 지정되지 않은 것처럼 적용되지 않습니다. 왜 그런 일이 일어나는지 이해하지 못합니다. 나에게는 Rewrite Rule이 실행되기 전에 스타일이 적용되는 것 같습니다. 나는 다음과 같은 방식으로 스타일을 연결하기 때문에 그렇게 생각합니다.

따라서 /123에서는 작동하는 것처럼 보입니다. 즉, Apache는 ../library/main.css를 찾을 수 있지만 /123/에서는 내장된 디렉토리인 것으로 보이며 ../library/main.css는 찾을 수 없습니다. 일하지 마세요.

어떤 아이디어가 있나요?

업데이트2:

알겠어요. 최종 .htaccess:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RedirectMatch ^(.+[\d+])/$ $1
RewriteRule ^([^/]*)$ mysitecom/movies/index.php?id=$1 [L]

Dsumsky, 당신의 도움을 주셔서 감사합니다! 귀하의 게시물을 답변으로 표시합니다.

답변1

귀하의 요구 사항을 충족하기 위해 테스트 VirtualHost를 만들고 의도한 대로 작동하는 것으로 보이는 다음 재작성 규칙을 구성했습니다.

RewriteEngine On
RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3

RewriteCond %{HTTP_HOST} mysite\.com [NC]
RewriteRule ^/movies/([^/]*)/?$ %{HTTP_HOST}/movies/index.php?id=$1 [L]

이 규칙은 일종의 영화 ID인 URI의 마지막 부분과 일치하며 후행 슬래시가 있는 경우 이를 제거합니다.

내가 구성한 대로 재작성 엔진 활성화 로깅과 관련하여 무슨 일이 일어나고 있는지 확실하지 않은 경우. 엔진이 수행한 모든 단일 단계를 검사하고 규칙을 올바르게 테스트할 수 있습니다.

다음 URL로 테스트했습니다.

http://mysite.com/movies/123
http://mysite.com/movies/123/

로그에서 해당 줄을 찾았습니다.

init rewrite engine with requested uri /movies/123
applying pattern '^/movies/([^/]*)/?$' to uri '/movies/123'
rewrite '/movies/123' -> 'mysite.com/movies/index.php?id=123'

init rewrite engine with requested uri /movies/123/
applying pattern '^/movies/([^/]*)/?$' to uri '/movies/123/'
rewrite '/movies/123/' -> 'mysite.com/movies/index.php?id=123'

관련 정보