두 개의 서버에 웹 앱이 설치되어 있습니다. 서버 중 하나에서 홈페이지에 액세스할 때 브라우저에 "오류 코드: ERR_TOO_MANY_REDIRECTS" 오류가 표시되는 반면 다른 서버에서는 모든 것이 잘 작동합니다. 두 서버 모두 Apache 2.4를 실행하고 있습니다.
Apache 구성의 어떤 부분이 리디렉션 규칙과 관련되어 있습니까? 두 구성 간의 차이점을 어디에서 찾아야 합니까?
혹시라도 htaccess 파일은 다음과 같습니다.
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
# Get rid of index.php
RewriteCond %{REQUEST_URI} /index\.php
RewriteRule (.*) index.php?rewrite=2 [L,QSA]
# Rewrite all directory-looking urls
RewriteCond %{REQUEST_URI} /index.php/$
RewriteRule (.*) index.php?rewrite=1 [L,QSA]
# Try to route missing files
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} public\/ [OR]
RewriteCond %{REQUEST_FILENAME} \.(jpg|gif|png|ico|flv|htm|html|php|css|js)$
RewriteRule . - [L]
# If the file doesn't exist, rewrite to index
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?rewrite=1 [L,QSA]
</IfModule>
# sends requests /index.php/path/to/module/ to "index.php"
# AcceptPathInfo On
# @todo This may not be effective in some cases
FileETag Size
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
</IfModule>
답변1
나는 이러한 다양한 동작이 구성의 차이로 인해 발생할 수 있다는 것을 종종 발견합니다. 이를 위해 나는 스크립트를 작성했습니다 (httpd-덤프-구성) httpd.conf를 평면화하여 비교하여 클러스터 노드 간 또는 환경 간(SSH를 통해서도) 간의 차이점을 감사할 수 있습니다.
.htaccess 파일은 확인하지 않지만 쉽게 간과되는 .htaccess 파일을 찾는 데 도움이 될 수 있습니다.
find $(httpd-dump-config | grep -i DocumentRoot | awk '{print $2}') -type f -name '.htaccess' -print
아래에 표시된 것처럼 ssh&diff를 사용하여 위의 작업을 시도하지 않는 것이 좋습니다(이스케이프하면 죽기 때문입니다).
.htaccess가 아닌 구성의 두 시스템 비교:
diff <(httpd-dump-config) \
<(ssh webserverB.dom httpd-dump-config)
또한 코드에서 리디렉션이 실행될 수 있는 가능성도 있습니다(예: PHP가 Location 헤더를 보내는 경우, 내가 본 많은 PHP에서 종종 어지러워지거나 숨겨지는 경우가 있음).
답변2
모든 브라우저에서 이 오류가 발생합니까?
이 문제가 발생할 때마다 항상 특정 브라우저의 작은 결함이거나 이상한 URL의 결과입니다.
다시 쓰기 규칙은 일반적으로 다음과 같습니다.
RewriteEngine on
RewriteCond /your/docroot/%{REQUEST_FILENAME} !-f
RewriteRule ^(.+) http://webserverB.dom/$**1
"여기서 문제는 이것이 DocumentRoot 내부의 페이지에서만 작동한다는 것입니다. 더 많은 조건을 추가할 수 있지만(예를 들어 homedirs 등을 처리하기 위해) 더 나은 변형이 있습니다."
RewriteEngine on
RewriteCond %{REQUEST_URI} !-U
RewriteRule ^(.+) http://webserverB.dom/$1**
"이것은 mod_rewrite의 URL 미리보기 기능을 사용합니다. 결과적으로 이것은 모든 유형의 URL에 대해 작동하고 안전한 방법입니다. 그러나 모든 요청에 대해 내부 하위 요청이 하나 더 있기 때문에 웹 서버의 성능에 영향을 미칩니다. . 따라서 웹서버가 강력한 CPU에서 실행된다면 이 서버를 사용하십시오. 느린 시스템이라면 첫 번째 접근 방식을 사용하거나 ErrorDocument CGI 스크립트를 사용하는 것이 좋습니다."
당신은 또한 살펴볼 수 있습니다확장된 리디렉션.