![.htaccess의 절대 URL로 리디렉션하면 OpenShift에서 잘못된 호스트 이름이 반환됩니다.](https://rvso.com/image/658339/.htaccess%EC%9D%98%20%EC%A0%88%EB%8C%80%20URL%EB%A1%9C%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%ED%95%98%EB%A9%B4%20OpenShift%EC%97%90%EC%84%9C%20%EC%9E%98%EB%AA%BB%EB%90%9C%20%ED%98%B8%EC%8A%A4%ED%8A%B8%20%EC%9D%B4%EB%A6%84%EC%9D%B4%20%EB%B0%98%ED%99%98%EB%90%A9%EB%8B%88%EB%8B%A4..png)
나는 에 웹사이트를 설정하고 있어요.오픈시프트. Apache 2.2.15에서 실행되지만 Apache 루트나 로그에 액세스할 수 없으므로 내 사이트 루트에 있는 .htaccess 파일의 가상 디렉터리를 에뮬레이션하려고 합니다. 대부분은 잘 작동하지만 알 수 없는 리디렉션 문제가 있습니다.
사이트는 다음과 같이 구성되어 있습니다.
앱 루트/repo- .htaccess가 위치한 사이트 루트
앱 루트/repo/domain_example
앱 루트/repo/domain_example/main- 메인 웹사이트(워드프레스)
WordPress에서 내 블로그는 www.example.com/blog에 있지만 WordPress로 마이그레이션하기 전에 blogs.example.com 하위 도메인에 여러 기사가 있었습니다. 링크를 유지하기 위해 .htaccess에 Redirect 명령을 설정했습니다. 이전 공유 호스팅 제공업체에서는 잘 작동했습니다. OpenShift에서도 잘 작동했습니다.~ 전에www.example.com을 OpenShift 별칭으로 추가했습니다. 그러나 별칭을 추가한 이후에는 .htaccess가 www를 반환하도록 강제할 수 없습니다. 원래 호스트 이름이 blogs로 시작하는 경우.
아파치에서문서 리디렉션:
새 URL은 구성표와 호스트 이름으로 시작하는 절대 URL이어야 합니다. Apache HTTP Server 2.2.6 이상에서는 슬래시로 시작하는 URL 경로를 사용할 수도 있으며, 이 경우 현재 서버의 구성표와 호스트 이름이 추가됩니다. 그런 다음 URL 경로로 시작하는 모든 요청은 대상 URL 위치의 클라이언트에 리디렉션 요청을 반환합니다.
내가 기대하는 것:절대 URL을 대상으로 제공하는 경우 리디렉션은 해당 URL을 클라이언트에 반환해야 합니다. 그러면 클라이언트는 올바른 URL을 사용하여 요청을 다시 발행할 수 있습니다.
무슨 일이 일어나고 있나요?리디렉션이 발생하고 있지만(Firebug에 302가 표시됨) 대상이 아닌 소스 도메인을 가리킵니다. 절대 URL을 제공했음에도 불구하고 두 번째 비트("현재 서버의 구성표 및 호스트 이름" 사용)를 수행하는 것과 같습니다.
다음은 내 .htaccess의 일부입니다.
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
# This section from https://my.bluehost.com/cgi/help/347#redirect
RewriteCond %{HTTP_HOST} ^(www.)?example\.com$
RewriteCond %{REQUEST_URI} !^/domain_example/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /domain_example/main/$1
RewriteCond %{HTTP_HOST} ^(www.)?example\.com$
RewriteRule ^(/)?$ domain_example/main/index.php [L]
# blogs.example.com redirects
redirect 302 /mark/post/Check-Windows-Time-Settings.aspx http://www.example.com/blog/2010/05/check-windows-time-settings/
해당 .htaccess를 사용하여 다음을 탐색할 때http://blogs.example.com//mark/post/Check-Windows-Time-Settings.aspxFirebug에서 응답을 보면 302 리디렉션이http://blogs.example.com/blog/2010/05/check-windows-time-settings/. 하지만 존재하지 않으므로 404 찾을 수 없음이 표시됩니다.왜 블로그에 가나요? 내가 www로 가라고 말하면. ?
OpenShift 별칭이 어떻게든 Redirect를 재정의하는지 궁금했지만 Redirect 문서에 따르면 다음과 같습니다.
리디렉션 지시문은 구성 파일의 순서에 관계없이 Alias 및 ScriptAlias 지시문보다 우선합니다.
또한 명시적인 트랩을 추가하고 blogs.example.com/blog/로 시작하는 경로에 대해 다시 작성해 보았습니다(리디렉션이 반환되는 것으로 보입니다).
RewriteCond %{HTTP_HOST} ^blogs\.example\.com/blog/ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
나는 여전히 404 Not Found를 얻습니다. 사실 가장 기본적인 URL이라도http://blogs.example.com/blog/, 404를 제공합니다.
이 상황에서 작업하도록 리디렉션을 받으려면 어떻게 해야 합니까?
2015년 5월 27일 업데이트 #1
Rewrite 블록에서 "not" 논리를 사용해 보았습니다.
RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
이로 인해 포기하기 전에 20번의 리디렉션이 발생하는 무한 리디렉션 루프가 발생합니다. 각 리디렉션은 여전히 다음으로 시작됩니다.http://blogs.example.com따라서 RewriteRule이 URL 시작 부분에 "www"를 쓰지 못하게 하는 문제가 여전히 발생하고 있습니다.
다음을 사용하여 NOT 논리를 종료하면 동일한 결과가 나타납니다 $
.
RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
2015년 5월 27일 업데이트 #2
@Quasidynamic은 %(HTTP_HOST)에는 호스트 이름만 포함되고 그 이후에는 아무것도 포함되지 않는다고 지적했습니다. 그래서 다음으로 시작하는 URL만 선택하려고 했습니다 www.example.com/blog
.
RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} ^/blog/$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L]
무한 루프는 없지만 리디렉션이 여전히 으로 이동하고 blogs.
다시 쓰기가 로 보내지 못합니다 www.
.
2015년 5월 28일 업데이트
@Quasidynamic의 요청에 따라 다음 블록을 시도합니다.
RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L]
지금까지 예상한 대로 을(를) 탐색하면 blogs.example.com
로 리디렉션됩니다 blogs.example.com/blog/
. 이는 여전히 RewriteCond와 일치하므로 로 리디렉션됩니다 blogs.example.com/blog/blog/
. 무한히. 절대로 로 이동하지 않습니다 www.example.com
. 이것이 제가 처음부터 겪었던 근본적인 문제입니다. OpenShift 하위 도메인으로 추가한 후에 는 무엇을 시도하더라도 blogs.example.com
더 이상 .htaccess를 사용하여 리디렉션할 수 없습니다 .www.example.com
답변1
[이전]이 blogs.example.com이고 [대상]이 www.example.com/blog인 경우:
RewriteCond %{HTTP_HOST} blogs.example.com$ RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=301,L]
당신은 가깝지만 요청에 대해 /blog를 일치시키려고 했으나 존재하지 않을 것입니다. 그것은 [대상] 사이트에만 있는 것으로, 제가 귀하의 상황을 이해하고 있기 때문입니다.
코드 301 사용 - "상태 301은 리소스(페이지)가 영구적으로 새 위치로 이동되었음을 의미합니다. 클라이언트/브라우저는 이제부터 원래 위치를 요청하지 말고 새 위치를 사용해야 합니다." ~에서
https://stackoverflow.com/questions/1393280/http-redirect-301-permanent-vs-302-temporary