Apache mod_rewrite를 디버깅하는 방법


171

mod_rewrite에는 두 가지 주요 문제가 있습니다.

1) 잘못된 규칙이있을 때 의미있는 오류가보고되지 않습니다

여기에 이미지 설명을 입력하십시오

2) 각 수정 사항을 안정적으로 테스트하려면 크롬 캐시를 삭제해야합니다. 이것은 로켓 과학이 아니지만 Ctrl + Shift + Delete를 누르고 확인을 클릭 한 다음 창을 닫고 다시로드해야합니다.

나는 어떤 전문가가 mod_rewrite 코드를 효율적으로 관리하기 위해 자신의 비밀을 기꺼이 공유하고 싶은지 알고 싶습니다.



답변:


283

한 가지 트릭은 다시 쓰기 로그를 설정하는 것입니다. 켜려면 아파치 기본 설정 또는 현재 가상 호스트 파일 (이 아닌) 에서 다음 줄을 시도하십시오 .htaccess.

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

Apache httpd 2.4 부터 mod_rewrite RewriteLog 및 RewriteLogLevel 지시문은 새로운 모듈 별 로깅 구성으로 완전히 대체되었습니다.

LogLevel alert rewrite:trace6

81
이것을 .htaccess에 넣을 수 없습니다. VirtualHost 구성에 넣어야합니다.
Attila Szeremi

7
파일에서 RewriteEngine On섹션을 활성화 .htaccess한 경우 아무것도 기록되지 않기 때문에 섹션도 있어야합니다 .
chacham15

12
Apache 2.4에서 로그 파일은 어디에 있습니까?
찰스 존 톰슨 3

4
관련 오류 로그에 2.4 로그 항목이 있습니다. 구성에 따라 다르지만 기본 데비안 / 우분투 설정은 /var/log/apache2/error.log에 있습니다.
Josiah

10
전문가 팁 : 다시 쓰기 로깅을 해제해야합니다. 잊어 버린 경우 특히 프로덕션 서버에서 하드 디스크를 상당히 빨리 채 웁니다.
존 헌트

132

Ben에서 언급 한 LogRewrite 지시문은 Apache 2.4에서 더 이상 사용할 수 없습니다. 대신 LogLevel 지시문을 사용해야합니다. 예 :

LogLevel alert rewrite:trace6

http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#logging을 참조하십시오 .


22
로그 파일은 어디에 연결되어 있습니까?
찰스 존 톰슨 3

8
@CharlesJohnThompsonIII-로그 파일은 오류 로그입니다 (ErrorLog 지시문으로 지정됨). 문서별로 grep을 사용하여 다시 쓰기 메시지를 얻을 수 있습니다.tail -f error_log|fgrep '[rewrite:'
billynoah

1
아파치를 다시 시작하는 것을 잊지 마십시오
회계사 م

1
나는 AllowOverride로 설정되어 있어야했다 All!
Michael

25

기본 URL 확인을 위해 수동 브라우저 대신 명령 줄 페처를 사용 wget하거나 curl테스트를 수행하십시오. 그런 다음 캐시를 지울 필요가 없습니다. 테스트 페치를 다시 실행하려면 위쪽 화살표와 셸을 입력하십시오.


14
또 다른 방법은 Chrome "Porn mode"(Ctl + Shift + N)를 사용하는 것입니다. 창을 닫으면 캐시 된 세션 컨텍스트가 휴지통에 쌓입니다.
TerryE

파이어 폭스의 "비공개 세션"브라우징도 생각합니다. 그러나 당신은이 컨텍스트가 개별 창마다 (따라서 크롬을 닫지 않습니까?)
Kaz

2
AFAIK, Chrome 및 Ff는 Ff가 개인 모드에 있거나없는 단일 프로세스로 실행된다는 점에서 다릅니다. Chrome을 사용하면 각 탭이나 창은 별도의 프로세스로 실행되며 개별 모드로 개별적으로 진행될 수 있습니다. 개인 창 / 탭을 닫으면 컨텍스트가 휴지통에 있습니다.
TerryE

1
FF에 대한 PrivateTab 애드온이 작동합니다. 각 탭은 개별적으로 작동합니다.
Javid

이 방법은 또한 리디렉션을 보여줍니다! 머신 아파치 설정 파일에 접근 할 수없는 누군가에게 좋습니다.
Geof Sawaya

14

있다 htaccess로 테스터 .

특정 URL에 대해 테스트 된 조건, 조건을 충족하는 규칙 및 실행 된 규칙을 보여줍니다.

그래도 약간의 결함이있는 것 같습니다.


2
나에게 그것은 코드없이 마지막 줄에 녹색 실행 규칙을 보여주었습니다.
Andy

@thombr 좀 더 정확할 수 있습니까? 링크가 작동하지 않습니까? 아니면 도구? 정확히 작동하지 않는 것은 무엇입니까? 이 질문과 관련하여 왜 관련이 있습니까?
Andy

1
이것은 URL이 예상대로 변환되고 있음을 말해줍니다 ... 그러나 실제 서버에서 나는 404를 받고 있습니다
Michael

@ michael은 테스트 된 규칙이 구성에 유일한 규칙입니까? mod_rewrite가 실제로 설치되어 활성화되어 있습니까?
Andy

재정의가 활성화되지 않은 것으로
Michael

3

를 기반으로 벤의 대답 (내 경우에는 데비안) 리눅스에 아파치를 실행하는 경우에는 다음을 수행 할 수 있습니다.

먼저 rewrite-log.load 파일을 작성하십시오.

/etc/apache2/mods-availabe/rewrite-log.load

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

그런 다음 입력

$ a2enmod 다시 쓰기-로그

뒤에

$ 서비스 아파치 2 재시작

다시 쓰기 규칙 디버깅을 마치면

$ a2dismod 다시 쓰기 로그 및 서비스 apache2 restart


이것은 작동하지 않았다. sandino @ envy : ~ $ sudo service apache2 restart * 웹 서버 apache2 재시작 [실패] * apache2 구성 테스트에 실패했습니다. 구성 테스트 결과는 다음과 같습니다. AH00526 : /etc/apache2/mods-enabled/rewrite-log.load의 1 행에서 구문 오류 : 잘못된 명령 'RewriteLog'(서버 구성에 포함되지 않은 모듈에 의해 철자가 틀렸거나 정의 됨)
sandino

3
@ sandino, 어떤 아파치 버전을 실행하고 있습니까? 이 구문은 2.4에서 변경된 것으로 보이며 대신 사용하십시오. LogLevel warn rewrite:trace8또는 LogLevel info rewrite:trace88은 1-8의 숫자 일 수 있습니다.
insaner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.