서버 측에서 URL 해시 (#)를 얻는 방법


133

클라이언트 측 (javascript)에서 windows.location.hash를 사용할 수 있지만 서버 측에서 액세스 할 수는 없습니다.


이 문제를 피할 수있는 방법을 얻었습니까? URL에 책갈피가 있고 서버 측에서 해시 후 텍스트에 액세스하고 싶습니까?
dotnetcoder

대답은 사용자 에이전트에 의해서만 해석되므로 서버에서 사용할 수 없다는 설명입니다. 서버 측에서 활성 탭을 변경하려고했습니다. 나는 대신 클라이언트 쪽에서 그것을했다.
Ricky Supit

답변:


134

ASP.Net 포스트 백에서 URL 해시를 유지해야하는 상황이있었습니다. 브라우저는 기본적으로 해시를 서버로 보내지 않으므로이를 수행하는 유일한 방법은 일부 Javascript를 사용하는 것입니다.

  1. 양식이 제출되면 해시 ( window.location.hash)를 잡고 서버 측 숨겨진 입력 필드에 저장 ID를 " urlhash" 로 DIV에 저장하여 나중에 쉽게 찾을 수 있도록하십시오.

  2. 서버 에서이 값을 사용해야 할 경우이 값을 사용할 수 있습니다. 필요한 경우 변경할 수도 있습니다.

  3. 클라이언트의 페이지로드 시이 숨겨진 필드의 값을 확인하십시오. 자동 생성 된 ID를 알 수 없으므로 포함 된 DIV에서 찾을 수 있습니다. 예, .ClientID로 약간의 속임수를 쓸 수는 있지만 래퍼 DIV를 사용하는 것이 더 간단하다는 것을 알았습니다.이 모든 Javascript가 외부 파일에 살고 일반적인 방식으로 사용될 수 있기 때문입니다.

  4. 숨겨진 입력 필드에 유효한 값이 있으면 해당 값을 URL 해시 ( window.location.hash again) 로 설정 하거나 다른 조치를 수행하십시오.

우리는 필드 선택 등을 단순화하기 위해 jQuery를 사용했습니다. 모두 jQuery 호출, 값 저장 및 복원을위한 몇 가지 jQuery 호출로 끝났습니다.

제출하기 전에 :

$("form").submit(function() {
  $("input", "#urlhash").val(window.location.hash);
});

페이지로드시 :

var hashVal = $("input", "#urlhash").val();
if (IsHashValid(hashVal)) {
  window.location.hash = hashVal;
}

IsHashValid()" undefined"또는 처리하고 싶지 않은 다른 것들을 확인할 수 있습니다.

또한 $(document).ready()물론 적절하게 사용하십시오 .


4
훌륭한 솔루션이지만 GET 요청은 어떻습니까?
Warlock

2
@Chris-그러나 단순히 GET 요청이기 때문에 다른 브라우저에 URL을 붙여 넣을 때 양식 제출 이벤트가 어떻게 호출됩니까?
KrishPrabakar

@Warlock은 get / post에 관계없이 숨겨진 필드에 해시를 저장하기 때문에 작동합니다.
KMX

83

RFC 2396 섹션 4.1 :

URI 참조가 식별 된 자원에서 검색 조치를 수행하는 데 사용되는 경우, 크로스 해치 ( "#") 문자로 URI와 분리 된 선택적 단편 ID 는 검색 후 사용자 에이전트가 해석 할 추가 참조 정보 구성됩니다. 작업이 성공적으로 완료되었습니다 . 따라서 URI의 일부는 아니지만 종종 URI와 함께 사용됩니다.

(강조 추가)


3
놀랐어요. SPA에 대해 많이 읽었으며 그것을 몰랐습니다. 그래서 브라우저는 너무 민감한 정보를 보내지 만 해시는 보내지 않습니다 ?? 나는 그것이 별도의 HTTP 헤더로 미래에 있어야한다고 생각합니다. 관련 내용 : onebigfluke.com/2015/01/…
bodrin


7

아마도 유일한 선택은 클라이언트 쪽에서 읽고 서버로 수동 전송하는 것입니다 (GET / POST / AJAX). Artur 감사합니다

Malcan에서 뒤로 버튼과 브라우저 기록으로 재생하는 방법도 볼 수 있습니다


3

실제로 GET / POST에서 프래그먼트를 보려고 시도하지 않고 실제로 서버 측 코드 내에있는 URI 객체의 해당 부분에 액세스하는 방법을 알고 싶을 가능성을 배제하기 위해 Uri.Fragment에 있습니다. ( MSDN 문서 ).


8
IE8, Chrome 및 Firefox는 모두 해시를 서버로 보내지 않습니다. 따라서 위의 응답에 따라 Request.Url.Fragment 서버 측을 검사하면 Uri.Fragment는 항상 빈 문자열입니다.
zcrar70

0

GET 요청에 대한 가능한 솔루션 :

새로운 링크 형식 : http://example.com/yourDirectory?hash=video01

컨트롤러 또는 위쪽으로이 함수를 호출 http://example.com/yourDirectory/index.php:

function redirect()
{
    if (!empty($_GET['hash'])) {
        /** Sanitize & Validate $_GET['hash']
               If valid return string
               If invalid: return empty or false
        ******************************************************/
        $validHash = sanitizeAndValidateHashFunction($_GET['hash']);
        if (!empty($validHash)) {
            $url = './#' . $validHash;
        } else {
            $url = '/your404page.php';
        }
        header("Location: $url");
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.