매개 변수 길이가> 255 인 다시 작성된 URL이 작동하지 않습니다


12

mod_rewrite를 사용하여 다음과 같이 URL을 다시 작성합니다.

http://example.com/1,2,3,4/foo/

.htaccess에서이를 수행하면 :

RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]

"1,2,3,4"가 255자를 초과하는 문자열로 바뀌는 경우를 제외하고는 잘 작동합니다. Apache는 "403 Forbidden"을 반환합니다.

foo.php?id=1,2,3,4ID 문자열이 매우 길더라도 직접 방문하는 데 아무런 문제가 없지만 옵션은 아닙니다.

내가 조정해야 할 Apache 또는 다른 설정이 있습니까?

업데이트 : RewriteLogLevel 9로 RewriteLog를 켰습니다. 짧은 ID 문자열을 사용하면 로그 파일에 여러 줄이 나타납니다. 그러나 id 문자열이 255자를 초과하면 아무것도 기록되지 않습니다 (mod_rewrite가 실행되지 않는 것처럼 보입니다).

이 질문이 흥미 롭거나 도움이된다고 생각되면 투표하십시오.


이것이 정규식 문제 일 수 있습니까? 255 자보다 긴 문자열에 대해 다시 작성된 요청이 올바른지 확인 했습니까? 그렇지 않은 경우 사전 및 사후 재 작성 요청을 게시 할 수 있습니다.
tomjedrz

3
와 mod_rewrite를의 로깅을 사용하도록 설정 RewriteLog하고 RewriteLogLevel그래서 당신은 일치되고 있으며이 정말 어떻게 다시 작성되고 있는지 확인할 수 있습니다. 나는 255 문자로 복사되고 있음을 추측 것 $1, 그 끝나는 것을 끝내 id아파치 내가 코드를보고하지 않은 (403)를 반환 있도록 클라이언트가 참조 할 수있는 권한이 부여되지 않은,하지만 그 아파치를 조작 할 수있다 고정 된 256 바이트 버퍼의 역 참조 (256 번째는 NULL 종료를 위해 예약 됨)
James Sneeringer

문제의 업데이트를 참조하십시오-긴 매개 변수에 대해서는 아무것도 기록되지 않습니다
philfreo

답변:


8

파일 시스템의 한계에 부딪쳤다 고 생각하십니까?

최대 파일 이름 길이는 255 바이트 일 수 있으며 아파치 또는 mod_rewrite 규칙이 파일이 존재하는지 확인하면 오류가 운영 체제에 의해 아파치로 반환됩니다.

.htaccess 파일에 규칙을 넣으면 문제를 해결하기에는 너무 늦습니다. Apache는 이미 파일 이름을 통계하려고 시도했으며 파일 시스템 오류 '(36) 파일 이름이 너무 깁니다'가 발생하여 403 오류를 반환했습니다.

앱 내에서 URL 패턴을 변경할 수 있습니다. 슬래시에서 슬래시까지 최대 255 자까지.

편집 : 이 문제에 대한 자세한 답변을 보려면 여기 를 보십시오 . 나는 거기에서 내 차를 빌렸다.


예, 이것은 현재 우리가 할 수있는 모든 것입니다. 해결 방법이나 조정을 기대하고 있습니다.
philfreo

3
Microspino, @Jeff Clark의 답변에서 serverfault.com/questions/120397/… 의 답변 중 일부를 잘라 붙여 넣은 것처럼 보입니다 . 당신은 그 대답에 하이퍼 링크를해서 그가 평판을 얻도록해야합니다.
Stefan Lasiewski

@ 스테판 lasieswski : 당신 말이 맞아, 참조를 추가했습니다.
microspino

아파치가 요청한 파일에 대해 통계를 작성하려고한다고 생각하는 것 같습니다. 너무 긴 URL이 다시 쓰기 엔진에 의해 선택되지 않는다는 것을 설명 할 수있는 유일한 방법 일 수 있습니다 ...
HorusKol

네, 일반적으로 URL과 파일 이름이 너무 길면 여러 가지 이유로 피해야한다고 생각합니다. 따라서 필자가 생각할 수있는 가장 좋은 조언은 파일 이름이 너무 길지 않은 경우 URL 패턴에서 무언가를 변경하는 것입니다.
microspino

2

이 제한에 대해 비슷한 질문이 있습니다 .

기본 파일 시스템의 한계에 부딪 칠 수 있습니다

.htaccess 구성의 어딘가에 REQUEST_FILENAME을 사용하고 있는지 모르겠으므로 제공된 솔루션이 작동하는지 알 수 없습니다.


그건 말이 되겠지만, 아니에요 .htaccess 파일을 전체적으로 포함하도록 질문을 편집했습니다. 다른 아이디어?
philfreo

httpd.apache.org/docs/trunk/rewrite/tech.html의 "Apache mod_rewrite 기술 세부 사항"에 따르면 , mod_rewrite는 URL을 URL로, URL을 파일 이름으로, 파일 이름을 파일 이름으로 다시 쓰지만 API는 현재 URL 만 제공합니다. -파일 이름 후크. ". 따라서 실제 파일에 도달하지 않더라도 파일 이름 후크의 URL이 OS 리소스 제한에 도달했을 수 있습니다.
Stefan Lasiewski

0

확실히 흥미로운 질문입니다. mod_security를 ​​실행하고 있다면 그렇게하지 않습니까? 아마도 그것은 단순히 긴 경로 이름이나 인코딩되지 않은 쉼표가있는 긴 경로 이름을 좋아하지 않습니까? ^^

본질적으로 URL 경로 또는 URL의 개별 세그먼트 또는 GmonC가 작성한 파일 시스템의 기본 해석에 대한 제한처럼 느껴집니다. 또한 쿼리 문자열에서 긴 부분을 가진 일반 URL이 제대로 작동하는 이유를 설명합니다.

이전 ASP.NET은 ~ 260 문자 또는 다른 것으로 요청 경로 제한을 사용했다고 생각합니다.


질문으로 업데이트를 참조하십시오. 그리고 아니, 난에 mod_security와 파일이 표시되지 않습니다 /usr/include/apache2/또는 /usr/lib/apache2/modules/(하지만 난 mod_rewrite를가 참조 할) 나는 있으리라 믿고있어 그래서이 설치되지 않은 것입니다.
philfreo

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.