커뮤니티토픽게시판

최근에도 이와 관련된 질문이 있었지만 저도 예전에 왜 그런지는 이유는 찾지 못했지만 

url 에 

?aaa=aaa  의 형태로는 

 

Context::get(aaa) 를 못가져와서 

 

주소에 

&aaa=aaa 의 형태를 가지도록 해서 그냥 해결을 보고 지나쳤는데요.

 

오늘은 주소의 형태를 제가 결정할 수 없는 구조에서 위와 같은 케이스가 발생해서...

결국

 

{@ $uri = getenv('REQUEST_URI');}

 

strpos($uri, 'aaa')

 

위와 같은 우회적인 방법으로 처리를 했네요. 

 

이게 라이믹스의 특수한 상황인지 아니면 원래 이게 정상인지 여부는 잘 모르겠네요.

혹시 같은 케이스에 해당하시는 분이 계신다면 이렇게 처리할 수 있어 남겨봅니다.

글쓴이 웹지기

profile
XE와 라이믹스를 운영하며 알게된 노하우를 공유합니다.
https://rxtip.kr/ 라이믹스 꿀팁
  • profile

    짧은주소: /topics/1458235

    긴주소: /index.php?mid=topics&document_srl=1458235

     

    짧은주소+파라미터: /topics/1458235?aaa=bbb

    긴주소+파라미터: /index.php?mid=topics&document_srl=1458235?aaa=bbb

    물음표가 이상한 자리에 들어갔죠?

     

    아마 이것 때문에 문법에 어긋나서 인식을 못 하는 것 같습니다.

    URL에서 첫번째 물음표 외에는 모두 &로 구분해야 하니까요.

     

    이 문제는 nginx에서 rewrite 규칙 뒤에 $is_args$args? 를 붙이면 해결할 수도 있다고 들었습니다만...

    라이믹스 2.0에서는 모두 PHP단에서 분석하도록 변경될 예정이라 그냥 미뤄두고 있습니다.

  • profile profile
    네. 2.0에서는 불편이 없어질 거라는 예상은 지난번에 한번 말씀하신 댓글에서 가능했었습니다.
    뭐 현재 시점에서 필요한 분도 있을 것 같아서 글 남겼습니다. 오늘 처리하다 보니 이 케이스를 만나서요.

    뭐 저도 어차피 2.0에서 해결될 문제가 큰 문제로 보지는 않고 있습니다.
  • profile
    getUrl과 같은 함수를 사용하여 해당 URL에 접속하신 경우가 아닌건가요? ㅎㅎ
  • profile profile
    아니에요. 기존에 다른 케이스에서도 단순히 게시판주소에 ?acb=y 형태로는 인식을 못했습니다. 짧은주소죠.
    그래서 그때도 어쩔수 없이 긴주소로 ? 뒤에 &abc=y 의 형태로 해서 해결했었습니다.
  • profile profile
    그런데 예전 다른 모듈의 controller 파일에서는 ?string=value 를 게시판 주소 짧은 주소 형태에 바로 붙여서 인식이 가능했던 기억이 있습니다.

    이게 템플릿에서 확인할때 안되는 것 같기도 하네요.
  • profile profile

    controller 파일의 대부분 메소드들의 실행은 post요청및 form을통해 요청하는 액션들입니다. form을사용할경우 주소에 붙이는게아니라 form 안에 input 태그를 hidden타입으로 값을 넣는게정석입니다.

    라이믹스는 그런 포스트액션들은 대부분 csrf보안취약점이 일어나지않도록 하고있으며 그런주소형태로 요청하는 대표적인 모듈이 xepushapp입니다.

    일반적으로 주소파라미터를 쓰는 경우는 controller 보다는 view에서 많이쓰는데 왜저런 값을 어느동작에 어디에 쓸건지에대한 이야기가없어 조언드리기가 곤란하네요ㅎㅎ

     

    정리.

     

    1. 주소파라미터를 쓰는 방식은 첫번재는 무조건 ?으로 시작하고 그뒤로는 &으로 계속 추가합니다. (이것은 기진님의 댓글에서 잘설명되어 있습니다.

    2. ?를 붙이나 &을 붙이나 사실 값의 변화는 없습니다.

    3. ? 를 붙였을때, &을 붙였을때 실행동작이 다른것은 1번의 규칙을 재대로 따르지 않은 경우이거나 POST요청을 사용하는 경우에서 사용되었거나 POST요청 이후 자동 라디렉트 되는 주소에서 해당 값이 누락된 경우가 되겠습니다. (템플릿에서는 POST요청에서 리디렉트를 시켜주지 않는다면 무조건 get ( 모듈의 view파일에 해당되는 액션들)만 요청하게 되므로 그때 짜여진 주소파라미터를 기준으로 Context::get 을 가져옵니다.

    4. 템플릿에서는 대부분 Context::set( 혹은 주소 파라미터 형식으로 으로 가져온 값들은 {$aaa} 와 같은 형태로 출력이 가능합니다. (Context::get을 따로 쓸필요가 없습니다.)

  • profile profile

    오해하시는 것 같은데요. 브라우저에 작접 타이핑한 주소입니다. 그걸 스킨에서은 주소에 ?srting=value
    부분이 있어도 값을 확인하지 못하는 상황입니다.

    https://abc.com/board1?abc=1

    이라고 접속했을때 레이아웃에서 abc가 확인이 안됩니다.

    &abc=1은 바로 붙이지 못하니 긴주소형태로 바꾸면 붙일수 있고 이때는 abc 값이 확인이 됩니다.

    템플릿에서 안된다는게 이런 경우구요.
    이전 외부페이지에서도 동일한 문제를 최근에 다른분이 질문하신 적이 있고 저도 경함한 적이 있어 댓글로 달았었구요.

     

    https://xetown.com/questions/1453070

  • profile profile

    사운드가 좋지 않으니 음소거 해주시길 바랍니다.

     

    이영상을 크게 해서 집중해서 봐주세요..

     

    제가 잘못한 걸까요? (화질설정 1440p까지 가능합니다. ) (라이믹스 최신 develop 기준입니다.)

     

    테스트 사이트 오늘 하루 동안 열어두도록 하겠습니다.

     

    https://rhymix.swhite523.com/board?aaa=1&bbb=2

  • profile profile
    아.. 제가 어제 케이스랑 외부페이지에서 안되었던 거랑 섞여서 햇깔렸네요.
    어제 레이아웃에서 안되었던 건 주소창에 직접 타이핑하는게 아닌 말씀하신 get,post 요청에 의한 주소 완성이었네요. (이 부분은 조금 특수한 상황일 것 같아 설명이 좀 어려울 수 있겠네요.)

    직접 타이핑해서 안되었던 것은 외부페이지에서 였구요.

    결론적으로 제가 이 글을 남긴 것은 안되는 상황에서 우회적으로 이렇게라도 할 수 있다 정도로 보면 될 것 같네요.
  • profile profile

    외부페이지가 어떤것을 의미는 것인지는 잘 모르겠으나 외부 PHP에서 실행되는거라면 템플릿이랑은 상관없는 것으로 보면되고 정 외부페이지에서 XE에 연동되어서 써야 할 경우 Context::set()을 활용하시는편이 낫습니다. (해당 외부페이지에서 템플릿파일을 실행하는 조건이 된다면요).

    그리고 일반적인 view 화면 (게시글 페이지 레이아웃에 추가할 수 잇는 항목) 에서는 기본적으로 제가 말씀드린 조건이면 정상적으로 실행되는것이 맞습니다. 기진님처럼 특수하게 잘못 입력하지 않는 이상 첫 파라미터 ? 추가 파라미터 &만 기억하시면 됩니다.

     

    마지막으로 뭔가 사실관계에서 잘 맞지 않는 부분이 있다는 판단으로 증명이 필요해서 기존 글에 테스트할 때 찍어둔 영상을 업로드 하게되었습니다. ㅠ_ㅠ 처음에 6시간전에 올린 댓글에 영상을 첨부하려다가 기분 상하실걸 우려해서 업로드 하지 않았는데 사실관계를 입증해야하는 상황이라 업로드하게 된점 양해 부탁드립니다.

  • profile profile

    기분 나쁜 것은 없구요. 외부페이지라 함은 외부페이지에서 주소 파라메타에서 값을 확인하지 못했다는 것 입니다. ?string 일 경우이구요. 제가 댓글에 다른 분의 질문글 링크를 했는데 거기 증상 중 일부가 외부페이지 에서 입니다.

    외부페이지라 함은 제가 모듈을 만들기 어려워서 외부파일 php를 작성해서 사이트에 업로드를 한 후 외부페이지에서 해당 php 경로를 설정하여 페이지를 만든 것을 말합니다.

    이경우 해당 php 코드에 주소 파라메터에서 값을 확인하기 위해 Context::get('abc') 를 해도 주소에 ?abc=1 로 타이핑하면 값이 확인이 되지 않은 상황입니다.

    다른 분 질문자분이 테스트 한 것 중 해당 외부페이지를 사이트 홈으로 지정하면 ?abc=1 로 접속해도 값이 확인이 된다는 정보도 제공이 되었구요.

    저의 경우는 그냥 url 형태를 처음 ? 가 나오고 뒤에 &abc 형태가 될 수 있는 긴주소로 접속해서 확인이 되도록 하는 정도로 해결을 보았습니다.

     

    외부페이지에서 주소파라메타중 제가 원하는 값을 꼭 확인해야 했던 이유는 그 접속만 유효한 동작을 하기 위함이었고 그러기 위해서는 Context::get('abc') 값 유무 확인이 꼭 필요해서 였구요.

     

    https://well-buying.com/corona19

     

    위 페이지가 바로 그렇게 만든 페이지 입니다.

    위 api 결과값이 캐시로 저장되서 굉장히 긴시간 캐시의 데이터로 방문자들에게 제공이 됩니다. 그런데 캐시 갱신은 제가 원하는값이 주소파라메터에 들어간 경우 캐시 갱신이되도록 코드를 짜는 과정에서 ?abc 형태는 확인이 안된다는 것을 확인했고(이유는 모르고) 긴주소 형태로 ? 이후 &abc=value 로는 인식된다는 것으로 확인이되었고 그냥 그렇게 처리했습니다.

     

    저 주소에 &xxx=1 라는 특수한 값을 주게 되면 api로 조회해서 갱신하게 되어있습니다. (xxx는 실제 값은 아닙니다.)

  • profile profile

    화면 캡처 2020-09-20 124435.png

     

    말씀하신대로 외부 PHP브라우저 실행후

    https://rhymix.swhite523.com/test.php?aaa=1&bbb=2

     

    값출력

    aaa값 : 1
    bbb값 : 2 

     

    정상적으로 출력되는 것 같습니다.

     

    Context::get<- 은 PHP함수가 아닌 RXE에서만 사용하는 클래스의 함수입니다.

  • profile profile

    1~4 라인은 특별히 필요하지 않아서 작성하지 않았구요.

    외부페이지를 위젯페이지로 만들어주는 위젯으로 mid를 가진 페이지로 만든 것입니다.
    아마 1~4 라인을 작성한 효과가 날 것으로 예상이 됩니다만... 이건 추측이라..

    Context::get 으로 값을 가져올 수 있으나 말씀 드린대로 &aaa 일때만 가져옵니다.
    이때 혹시나 해서 $_GET[] 으로 해 보았으나 동일한 결과라 그냥 Context::get 으로 코드를 작성해서 사용중입니다.

     

    아마 컴파일 과정에서 인식이 ?이후의 &만 인식되는 경우가 있는 것으로 추측만됩니다.

     

    조금 복잡한 구조를 설명을 드리면

     

    a.html 이 외부파일입니다.

    a.html을 외부페이지 위젯을 통해 aaa 페이지를 생성했습니다.

     

    그런데 php 코드는 aa.php 에 작성되어 있습니다.

     

    a.html 에

     

    {@ $data = _XE_PATH_.'aa.php'; }

     

    aa.php 에서 

    데이터의 캐시를 하게 되는데요.

     

    Context::get('aaa') 를 확인하고 캐시를 갱신하는 코드로 작성되었어요.

     

    아마 컴파일이 되는 순서등에 의해 ? 이후 &aaa 여야만 확인이 되는 것 같은 상황입니다. 

    일반적인 상황은 아닌거라 그냥 무시하셔도 될 것 같구요. 

     

    저와 같이 특별한 상황인데 주소형태를 직접 바꾸지 못하는 경우에는 제 본문과 같이 그냥 주소 자체를 모두 가져온 후 거기에 원하는 string이 있는지 확인해서라도 가능하다라고 이해하시면 좋을 것 같습니다.

     

    *테스트를 해주셨으니 제가 구성한 방법이 아닌 말씀 하신대로

    https://rhymix.swhite523.com/test.php?aaa=1&bbb=2 와 같이 php파일을 직접 주소에서 불러와서 ?뒤에 붙이면 인식할 것 같은데 그건 제가 원하는 구성은 아니라서요.

  • profile profile

    그렇다면 해당 위잿문제이겠네요 ㅎㅎ

    일반적으로 ? 나 &나 주소파라미터로 시작하고 규칙만 맞으면 둘다 구분없이 잘 떠야 하는게 정답입니다.

    주소를 &aaa 일때만 가져오신다고만 하셔서 어떤형식의 주소를 위젯에서 가져오는지 모르겠지만 일반적으로 제가 말씀드리는 것과 동일하게 만들어야 합니다.

    기진님이 말씀하신 것처럼

    domain.com/index.php?aaa=11&bbb=22?ccc=33

    이렇게 작성될 경우 ?ccc 의 값은 원래 입력받지 못하는게 맞습니다. (파란색 파라미터는 잘 입력되었기에 정상적으로 값이 나옵니다.

    이런형태로 주소를 만들어버린게 아닌지에 대해서 말씀을 안해주셔서 이런 경우가 아닐까 생각됩니다. &으로 가져오는게 가능한데 ? 만 안된다는게 이상하네요 ㅎㅎ

    &가 될려면 앞에 ?를 선언한 파라미터가 무조건 하나 있어야 하는데 어딘가 ?를 사용하였다면 뒤에서는 사용할 수 없거든요.

    ?<-는 주소에서 무조건 한개, 그뒤로는 &으로 여러개 이거만 기억하시고, 실제 호출되는 주소를 확인하셔서 디버깅 해보세요.

  • profile profile
    네. 결론적으로는 정상적인 상황에서는 되는게 맞구요. 약간 변칙이나 특이한 상황에서 안되는게 맞습니다.
    지금 강조하신 위에 ?ccc 형태로 해서 안된건 아니구요.

    그리고 제가 지금 본문을 쓰게 된 주소를 제가 결정하지 못하는 경우도 RXE에서 자체적으로 만들어서 사용하는 것이 아니기에 RXE에서 주소를 처리하는 것에서 실제로 보여지는 주소에서 일부가 버려지는 것인데 눈으로 보기에는 그걸 알아채지 못해서 발생하는 오해 내지는 알아채지 못하는 정도로 봐야 할 것 입니다.

    외부와 연동해서 얻어진 주소가
    https://도메인.com/search?results=검색값
    (results 는 RXE에서 관여한게 아니라)

    이런식이면
    https://도메인.com/?mid=search
    이렇게 인식합니다.(소스보기에는 그렇게 나오네요) 물론 RXE 보안에 따라 처리되는게 있겠죠.

    그런데 주소창에는 https://도메인.com/search?results=검색값

    이렇게 계속 보이니 저는 레이아웃에서 results 확인해 보려고 노력했었던 건데 이게 안되는 거더라구요.

    그래서 그냥 레이아웃에서 주소 전체를 가져와서 거기에 내가 원하는 string이 있는지 확인해서 해결을 한거구요.

    해당 mid 를 그냥 접속한 것, 검색어를 넣고 접속한 것 구분이 필요했었습니다.


    설명해주신 부분으로 대략 안되는게 RXE에서 내부자료들이 이용하는 방식 외 다른 경우 안되는 것에 대해 이해는 했습니다.
  • profile

    작업하다가 의문점이 들어...
    XE타운에서 관련 글을 본 것 같아, 작성한지 좀 지난 게시글이지만 댓글 등록합니다.

     

    ---

    이 부분의 처리가 좀 의문스러운데요.

    https://example.com/board_mid?custom_parameter=1
    으로 접속할 경우, $_GET['custom_parameter'] 을 접근할 수 없는 건 좀 잘못된게 아닌가 싶습니다.

     

    htaccess 파일을 보면 아래와 같이 정의되어 있습니다.
    RewriteRule ^([a-zA-Z0-9_]+)/?$ ./index.php?mid=$1 [L,QSA]

     

    ...? 대체 왜 이렇게 처리해 두었는지 사실 이해가 잘 안됩니다.

     

    룰에 /? 까지도 입력해 두었으면서,

    왜 RewriteRule ^([a-zA-Z0-9_]+)/?(.+)$ ./index.php?mid=$1&$2 [L,QSA] 가 아닌지 이해하기 힘듭니다ㅠ

    뭔가 보안상의 문제가 있는걸까 싶기도 합니다만, 일단 제 단편적인(?) 생각으로는 떠오르는게 없군요.

     

    ---

    아무튼...

    mid 뒤의 패러미터를 받아올 수 있도록 처리할 필요가 있어 보입니다.

     

    물론 @람보님 께서 말씀하신대로 getUrl() 을 사용하면 알아서 깔끔하게(?) 처리해 주기는 합니다만...

     

    이번에 /action?a=b&c=d 와 같은 URL을 구성해야 할 상황이 있었습니다.

    특히... action 이 모 게시판의 mid 다 보니... (새로운 모듈을 작성할 정도의 코드가 아니었습니다.. 핳;;)

     

    ---

    getUrl() 을 통해 웬만한 부분은 다 커버가 된다는 부분도 있고,

    제가 든 예시의 경우, 모듈을 제작하여 사용하면 충분히(?) 처리할 수 있는 부분도 있기는 합니다만...

     

    그렇다고 해도, 짧은 주소 형태에서 mid 뒤의 패러미터를 받아올 수 없는 건 또 문제가 있다고 봅니다.