.htaccess가 www-prefixed 페이지로 올바르게 리디렉션되지 않습니다


9

www없이 URL을 리디렉션하려고합니다. www.version (example.com에서 www.example.com으로)으로 이동하십시오. 나는 평소 사용

RewriteCond %{HTTP_HOST} ^example\.com [nc]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

이것은 다른 모든 프로젝트에서 작동합니다. 그러나이 특정 사이트에서는 리디렉션 루프로 끝납니다. 이상한 부분이 있습니다 : www가 아닌 ​​버전을 컬하여 어떤 헤더를 사용하여 보냈는지 보았습니다 curl --get http://example.com --dump-header domain.header > domain.html. 헤더 파일은 다음과 같습니다.

HTTP/1.1 301 Moved Permanently
Date: Mon, 06 Jun 2011 14:45:16 GMT
Server: Apache/2.2.16 (Debian)
Location: http://example.com/
Vary: Accept-Encoding
Content-Length: 310
Content-Type: text/html; charset=iso-8859-1

그러나 결과 HTML 파일은 다음과 같습니다.

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.example.com/">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at example.com Port 80</address>
</body></html>

(파일 간의 주소 차이에 유의하십시오) 누구 든지이 문제를 해결하는 방법을 알고 있습니까? 다른 URL 재 작성 지시문은 정상적으로 작동합니다.

편집 : 다시 쓰기 로그에 포함 된 내용 : (많은 사람들이 사이트에 액세스하므로 다시 쓰기 로그가 꽤 길어졌습니다. 이것이 올바른지 100 % 확신하지 못합니다)

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] strip per-dir prefix: /var/www/oup/81/ ->
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] applying pattern '(.*)' to uri ''
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] rewrite '' -> 'http://www.example.com/'
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] explicitly forcing redirect with http://www.example.com/
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] escaping http://www.example.com/ for redirect
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] redirect to http://www.example.com/ [REDIRECT/301]

액세스 로그 라인 (아마도 올바른 것) :

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] "GET / HTTP/1.1" 301 555 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.77 Safari/534.24"

가상 호스트의 정의 :

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName example.com
        ServerAlias example.com www.example.com
        DocumentRoot /var/www/example/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/example/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride All
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

EDIT2 : 좋아, 방금 내가 그렇게하면 (사명하고 .htaccess없이 이것을 리디렉션하려고 시도했다)

//if clause determining that we're running on example.com and not www.example.com
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.example.com' . $_SERVER['REQUEST_URI']);
header('Connection: close');

정확히 같은 리디렉션 루프가 발생 합니다. 진심으로, 대체 뭐야? 누구나이 문제를 일으킬 수있는 아이디어가 있습니까?


아파치를 직접 컴파일 했습니까? 이 경우 Location 헤더가 동일한 변수에서 가져 오기 때문에 Location 헤더가 페이지의 내용과 다를 수 없으므로 불가능합니다. 요청이 Apache로 직접 전달된다고 가정합니다. 맞습니다. 다른 서버는 없습니다.
Tim Stone

나는 아파치를 직접 컴파일하지 않았으며 사이에 다른 서버가 없습니다.

아마도 NS 서버가 제대로 구성되어 있지 않을 것입니다.
venimus

4
ServerAlias ​​항목에서 서버 이름을 반복 할 필요는 없습니다.
chris

여기에 파일의 모든 내용을 넣을 수 있습니다
취소

답변:


2

Location: http://domain.cz/CURL이보고 한 헤더 행 이 이상하게 들리는 것은 저 입니다. 해당 도메인으로 리디렉션하지 마십시오. 리디렉션 로그에도 이에 대한 언급이 없습니다.

어떻게 든 Locationmodrewrite가 헤더를 변경 한 후 헤더가 변경 된 것처럼 보이며 PHP로 헤더를 변경하려고 시도했기 때문에Location 요청이 처리 된 후 헤더가 변경되었습니다. 내가 생각할 수있는 유일한 설명은 mod_header를 사용하여 위치 헤더를 수정하고 있다는 것입니다.

다음과 비슷한 줄을 찾으면 모든 구성 파일 (httpd.conf, 포함 된 .conf 파일 및 .htaccess 파일)을 확인 했습니까?

Header set Location (...)

또는

Header edit Location (...)

나는 이런 것을 찾지 못했습니다.

2
Apache에 직접 연결하고 있습니까, 아니면 헤더를 변경할 수있는 캐싱 또는 프록시 서버가 있습니까? ProxyPassReverse 지정 문은 위치 헤더 ( httpd.apache.org/docs/2.0/mod/mod_proxy.html#ProxyPassReverse )를 변경할 수도 있습니다 .

그 사이에 프록시가있을 수 있습니다. 내일 일하자마자 살펴 보겠습니다.

@ Jakob Egger-ProxyPassReverse 지시문을 찾지 못했습니다.
cypher

1

rewritelog를 활성화하는 것 외에 (httpd.conf를 변경할 수있는 경우)이 사이트에있는 응용 프로그램을 방정식에서 제거해야합니다. 기본 index.php (또는 앱을 제공하는 인덱스 페이지)를 일시적으로 제거 / 이름 바꾸기하여 이로 인해 발생하지 않는지 확인하십시오.

이러한 아파치 기본 리디렉션 페이지가 잘못 구성된 경우 응용 프로그램 (예 : 워드 프레스)에 대한 많은 보고서가 있습니다.

또한 나머지 아파치 구성을 확인하여 충돌 할 수있는 다른 '리디렉션'지침이 있는지 확인하십시오.


응용 프로그램은 괜찮습니다. 다른 서버와 다른 도메인에서 (전체 응용 프로그램을 복사했습니다) 시도했지만 정상적으로 작동했습니다. 나는 그것이 아파치 구성의 무언가라고 생각하지만, 나는 무엇을 알아낼 수 없다.

앱에 문제가 없지만 서버 의 설정과 충돌 할 수 있습니다 . 앱이 현재 제작중인 것 같아서 '비활성화'가 이상적이지 않은 것을 알 수 있습니다. 재미있게 찾기를 돕기 위해 플래그 끝에 리디렉션 끝에 쿼리 ​​문자열을 추가 할 수 있습니다. 따라서 / $ 1? nowww = 1 또는 이와 유사한 것입니다.
Gavin C

아니요, 프로덕션 환경에 없습니다.

멋진 아, 다음 : 문제의 일부로 제외 100 %에 방해가 인덱스 파일을 이동 다치게 할 수 없어
개빈 C

아, 저주, 제가 쓰기에 의미하는 것은 몰라, 그 TIS는 생산 IS 얼마나 :-)이 happenned

0

이 대체 mod_rewrite 코드를 사용해 볼 수 있습니까?

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

이것은 정확히 같은 방식으로 실패했습니다.

RewriteLog를 활성화하고 무엇이 튀어 나왔는지 확인할 수 있습니다.
anubhava

정확히 어떻게 할 수 있습니까? :-)

여기를 참조하십시오 : httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog 이 지시문은 .htaccess가 아닌 아파치 설정으로 이동한다는 것입니다.
anubhava

1
필자는 위의 답변과 같은 규칙을 Apache 설치에 복사하고 질문에있는 것과 동일한 curl 명령을 실행하고 Location: http://www.domain.com/헤더의 일부로 사용하므로 헤더와 html 모두 동일한 도메인을 표시합니다 www.domain.com. 위의 질문에서 관련 access.log 줄을 붙여 넣을 수 있습니까?
anubhava

0

[nc] 대신 [NC]를 사용하려고하면 너무 간단 할 수 있습니다


그리고 아직 :-)되지 않습니다 (이미 시도했지만 작동하지 않았습니다)

0

서버 액세스 권한이 있기를 바랍니다. 사이트 문서 폴더가 지정된 후 리디렉션 라인을 추가했습니다.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain\.cz [NC]
RewriteRule ^/(.*) http://www.domain.cz/$1 [L,R=301]

서버에 대한 액세스 권한이 없으면 httaccess에서 해당 줄을 추가하여 부분을 시작 / 변경하십시오.

리디렉션 전에 "RewriteEngine on"을 추가하지 않았을 수 있습니다.


내가 RewriteEngine on말했듯이이 서버가 아닌 다른 서버에서 제대로 작동합니다.

AllowOverride 모두 허용은 서버 구성 파일에 해당 행을 추가합니다.

0

시험:

RewriteCond %{HTTP_HOST} ^domain.cz [NC]
RewriteRule (.*) http://www.domain.cz/$1 [R=301,L]

0

Options +FollowSymLinks디렉토리 컨텍스트 내에서 작업하는 경우 반드시 있어야 합니다.

그렇지 않으면 이름 기반 가상 호스트를 사용하는 경우 다음을 시도하십시오.

<VirtualHost *:80>
  ServerName domain.cz
  Redirect / http://www.domain.cz/
</VirtualHost>

<VirtualHost *:80>
  ServerName www.domain.cz
  # whatever else
</VirtualHost>

VirtualHost의 정의로 질문을 업데이트했습니다.

위의 여러 VirtualHost 솔루션을 사용해 보셨습니까? 아니면 mod_rewrite를 사용하도록 설정 했습니까?
chris

firts에서 여러 VirtualHost를 사용하고 싶지는 않았지만 어쨌든 시도했지만 도움이되지 않았습니다.

0

모든 답변을 읽은 후 / etc / hosts 파일을 확인할 수 있습니다 ... 어쩌면 모든 검사가 컴퓨터에서 이루어 졌을 것입니다. 다른 위치에서 액세스하십시오.


아니요, 해당 도메인에 대한 호스트는 없습니다.

0

두 번째 아이디어가 있습니다. 게시 한 서버 로그에는 로컬 네트워크의 주소 인 "192.168.1.221"의 주소가 표시됩니다. 모든 로그 항목에 동일한 IP 주소가 표시됩니까? 이 경우 사용자와 서버 사이에 프록시가 있습니다. 이 프록시는 아마도 헤더 를 사용 ProxyPassReverse하거나 Header edit변경합니다 Location.

이는 백엔드 서버가 Location외부 프록시 서버의 호스트 이름이 아닌 자체 호스트 이름을 헤더에 넣을 때 문제점을 피하기위한 일반적인 설정 입니다.

프록시 서버가 실제로있는 경우 프록시가 항상 정보를 덮어 쓰므로 백엔드 서버의 구성 대신 프록시 서버의 구성을 변경해야합니다.

이것은 우리가 항상 잘못된 서버를보고 있다는 것을 의미합니다. 문제는 프록시 서버에 있습니다!


내일 나는이 서버를 운영하는 회사의 기술 지원을 부르고있다. 그게 틀림 없다고 생각합니다. 알려 드리겠습니다.
cypher

0

.htaccess파일 에서 null과 같은 인쇄 할 수없는 문자 일 수 있습니다 .

hexdump -C .htaccess

0

다시 쓰기 조건 후에 $ 기호가 누락되었다고 생각합니다. 시도하십시오 :

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.