URL Rewrite 에서 인코딩된 주소를 재작성시 제대로 처리하지 못하는 문제

Problem discription

URL rewrite 가 인코딩된 주소를 받고, 이를 재작성(또는 리디렉션) 된 주소에 다시 활용하는 경우 잘못 인코딩된(=입력과 동일하지 않은) 주소를 반환하는 문제.

Background

워드프레스에서 제목을 한글로 쓰면 퍼머링크도 기본적으로 한글로 작성되기 때문에 이것을 수정하지 않고 저장하면 페이지 보기가 안되고 404 가 뜨는 문제가 있었다.

이것이 OS의 레거시 인코딩 문제(윈도우즈에서 유니코드가 아닌 ANSI 문자열을 사용하는 레거시 API를 호출하는 프로그램이 겪는 문제) 라고 생각했었는데… 아주 틀린 건 아니지만 내가 생각한 종류의 것은 아니었다.

알고보니 한글로 작성을 하더라도 클라이언트에서는 이 퍼머링크를 인코딩하여 보내므로 저장까지는 인코딩 문제가 발생하지 않고 잘 된다. 그러나 페이지 보기를 누르면 워드프레스의 설정의 사이트 주소가 http 를 기준으로 설정되어 있으므로 퍼머링크도 http 링크로 생성되어1 클라이언트가 http 주소로 접속을 시도한다. 그러면 서버는 이 요청을 https 리다이렉트 룰에 의하여 https 주소로 리다이렉트하는데, 이 과정에서 URL rewrite 가 프로토콜만 변경하고 나머지 값은 그대로 유지하여야 하지만 실제로는 그렇게 동작하지 않아서(path 값이 입력 그대로가 아닌 잘못 인코딩된 값으로 반환된다) 결국 404 에러가 발생하게 된다.

이것을 해결하기 위해서는,

  1. 워드프레스 사이트 주소를 https 로 설정
  2. 리다이렉트 룰이 제대로 인코딩 된 주소를 보내도록 수정

중에 하나를 수행하여야 하는데, 현재는 2개 모두 적용했다.

1. 의 경우에는 wp_config.php 파일의 WP_HOME 및 WP_SITEURL 변수를 수정해주면 되고, 2. 의 경우에는 아래에 서술한다.

Solution

원래는 이런 식의 https 리다이렉트 룰을 썼었다.

 <rule name="https redirect" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
          <match url="*" />
          <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{HTTPS}" pattern="OFF" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}{R:0}" redirectType="Permanent"  />
        </rule>

이것을 보면, 룰에 의하여 캡처된 주소를 그대로 리턴하므로 문제가 없을 것 같지만 실제로는 잘못된 주소를 리턴한다.

이를 해결하기 위해 현재는 다음의 룰을 사용한다.

 <rule name="https redirect" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
          <match url="*" />
          <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{HTTPS}" pattern="OFF" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}{UNENCODED_URL}" redirectType="Permanent"  />
        </rule>

캡처 과정에서 문제가 발생하는 것 같아 {R:0} 대신 {UNENCODED_URL} 를 사용하여 클라이언트가 요청한 값을 그대로 돌려주도록 했다.

한편, URL Rewrite Module Configuration Reference2 에 의하면 또한 {HTTP_X_ORIGINAL_URL} 도 제시되고 있는데, 로그를 보면 X-ORIGINAL-URL 서버 변수는 기록되고 있는 것으로 보이지만 URL Rewrite 에서 저 변수를 쓰면 그냥 공백이 리턴된다. 전에도 다른 건으로 검색해보았지만 납득할만한 설명이 없었던 것으로 보아 이것 또한 버그로 보인다.

Continue reading “URL Rewrite 에서 인코딩된 주소를 재작성시 제대로 처리하지 못하는 문제”

azure 에서의 wordpress 설치에 관한 이야기

대충 wordpress.com 에서 azure web app 으로 옮겨온지 한달 정도 되는 것 같다.

wordpress.com 에서 옮겨온 이유는

  1. .com 특유의 괴상한 에디터 (느리고 기능은 부족한)
  2. 카테고리 대량 편집이 안됨

때문이었다.

그래서 옮겼는데… 두 가지 정도 문제가 있다.

  1. 한글 파일 업로드가 안된다.
    가급적이면 한글로 된 파일도 영어로(ascii)로 바꿔서 올리기 마당에 크게 문제인가 싶기도 하지만 역시 캡처 도구로 저장한 파일을 올렸다가 깨진 미디어 파일만 생겨서 삭제하고 다시 이름을 바꿔서 올려야 하는건 생각외로 짜증나는 일이다.
  2. 초기 로딩이 오래 걸린다.
    처음엔 azure web app 이 다 이런 줄 알았는데 리버스 프록시 등은 이렇게 오래 안 걸리는 걸 보니 이건 아마 in-app mysql 의 로딩에 많은 시간이 걸리는 것 같다. 후술하겠지만 로딩이 완료되고 난 후의 성능은 가장 좋고 web app 내에서만 접근이 가능하기 때문에 보안 설정 등이 따로 필요 없다는 점도 좋은데 역시 초기 로딩이 너무 오래 걸린다. 한 10초 걸리는 줄 알았더니 재 보니까 30초나 걸리더라..

1. 같은 경우는 플러그인으로도 해결할 수 있을 것으로 보이고 사실 굳이 고쳐야겠다는 생각이 들지 않지만 2. 같은 경우는 아무래도 어떻게 좀 해결할 방법이 없을까 싶어서 다시 옮길 생각을 하고 여러 조합을 검토해보았다.

일단 셀프 호스팅은 보류. 이미 한번 시도해봤다가 관리 안하고 그냥 폐기된 적이 있기 때문에 이번에도 같은 꼴을 볼 것이 뻔하므로 패스하기로 했다.

 

첫 번째 대상은 azure 에서 기존부터 서비스하던 cleardb. 처음에는 관리 콘솔에 접속하는데 가입을 요구하기에 그냥 지나쳤는데 이전을 검토하면서 속도를 검토해보니 in-app mysql 보다 훨씬 느려서 안 쓰기로 했다. 성능 분석을 해보니 in-app 의 경우는 2-3 초 걸리는데 이건 7초 이상 걸려서 안 쓰기로.

두 번째 대상은 project nami. wordpress 를 mysql 대신 mssql 과 함께 쓸 수 있도록 하는 포팅 버전이다. 일단 배포 자체가 오류가 많아서 설치하는 데 엄청나게 고생했는데… 결과적으로 encoding 문제가 심해서 그만두기로 했다. ProjectNami.UTF8 옵션을 써도 실제로 utf8 로 작동하는게 아니라 sql server의 인코딩으로 변환해서 쓰는 것 같다. 내가 테스트했던 경우 Korean_Wansung_CI_AS 을 썼었는데 ー와 같은 장음 표시가 ?와 같이 표시되는 등 유니코드를 지원하지 않는 프로그램이 겪는 인코딩 문제를 그대로 겪고 있었다.

 

그래서 아무튼 현재는 현상 유지로 방침을 굳혔는데… 음… 그래도 초기 로딩 문제는 어떻게 좀 하고 싶은데 말이지.


2017-03-14 update:

hello cloud 2017 2nd challange 가 in-app mysql 을 사용하는 예제인 거 같은데 이거 업데이트하면서 초기 기동시 30초 걸리는 문제를 해결한 듯. 현재는 이러한 문제가 없다. 덕분에 난 아무것도 하지 않았지만 문제가 해결됐다.


2017-03-15 update:

현재 다시 로딩하는 데에 30초 정도 걸린다. 나 참…

워드프레스에 일부 파일 업로드가 불가능한 문제

file type filter 를 추가해도 여전히 “file type is not permitted for security reasons” 에러가 나길래 짜증이 좀 났는데,

결론은 wordpress 3.7.1 버전의 버그라고 한다. (3.7.2 포함)

extra file types 플러그인에 file extension 만 체크하는 옵션을 체크하면 mime 체크가 비활성화 되는 줄 알았더니 버그 때문에 생긴 문제라 그런지 안된 모양이다.

해결책은 버그가 수정될 때까진 아래의 플러그인을 활성화해주는 것 뿐이다.

https://wordpress.org/plugins/disable-real-mime-check/