서버 측 애플리케이션 (PHP, Ruby, Python 등)에서 URL의 해시 부분을 읽을 수 있습니까?


217

URL을 가정하면 :

www.example.com/?val=1#part2

PHP는 val1GET 배열을 사용하여 요청 변수 를 읽을 수 있습니다 .

해시 값 part2도 읽을 수 있습니까? 아니면 브라우저와 JavaScript에만 해당됩니까?

답변:


203

주요 문제는 브라우저가 조각 부분으로 요청을 보내지 않는다는 것입니다. 조각 부분은 브라우저에서 바로 해결됩니다. JavaScript를 통해 접근 할 수 있습니다.

어쨌든 parse_url ()을 사용하여 조각 부분을 포함하여 URL을 비트로 구문 분석 할 수는 있지만 분명히 그렇지는 않습니다.


98

http : // localhost : 8000 / hello? foo = bar # this-is-not-sent-to-server에 액세스하는 간단한 테스트

python -c "import SimpleHTTPServer;SimpleHTTPServer.test()"
Serving HTTP on 0.0.0.0 port 8000 ...
localhost - - [02/Jun/2009 12:48:47] code 404, message File not found
localhost - - [02/Jun/2009 12:48:47] "GET /hello?foo=bar HTTP/1.1" 404 -

서버는 #appendage없이 요청을받습니다. 해시 태그 뒤에는 단순히 클라이언트에서 앵커를 조회하는 것입니다.

예를 들어 다음을 사용하여 javascript를 통해 URL 내에서 사용되는 앵커 이름을 찾을 수 있습니다.

<script>alert(window.location.hash);</script>

프래그먼트 ( http://codepad.org/BDqjtXix )를 포함하여 필요한 URL 문자열이 이미 있으면 PHP의 parse_url () 함수가 작동 할 수 있습니다 .

<?
echo parse_url("http://foo?bar#fizzbuzz",PHP_URL_FRAGMENT);
?>

Output: fizzbuzz

그러나 PHP는 클라이언트 전용이기 때문에 조각 정보를받지 못한다고 생각합니다.


48

Javascript-as에서 검색 할 수 window.location.hash있습니다. 거기에서 Ajax를 사용하여 서버로 보내거나 인코딩하여 URL을 입력하여 서버 측으로 전달할 수 있습니다.


1
감사! 따라서 이것을 대신하여 명확하게 www.example.com/?val=1#part2 하기 위해 다음 www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 과 같이 서버에서 리디렉션해야합니다. 물론 다른 페이지의 다른 URL로 리디렉션하려면 지원을 추가해야합니다. 굉장하지는 않으며 물론 모든 사용 사례에서 작동하지는 않지만 책갈피에서는 작동합니다. 이렇게하면 안전하지 않은 리디렉션으로 연결
— Brad Parks

25

해시는 서버로 전송되지 않으므로 아니오입니다.


8

예, 서버에 앵커 부분이 없습니다. 그러나 쿠키를 사용하는 해결 방법이 있습니다. 여기에서 찾을 수 있습니다 : http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/


2
이 "해결 방법"은 쓸모가 없습니다. 페이지 뷰당 2 개의 요청이 있으면 12 가지 더 나은 기술이 있습니다.
— umassthrower

11
그것은 어떻게 쓸모 없는가? 이것은 확실히 가치가 없습니다. 그러나 더 나은 기술이있을 수 있습니다.
— Kishor

더 나은 기술은 무엇입니까? 내 Google oauth의 경우 액세스 토큰 해시로 내 api 페이지로 리디렉션하는 다음 "ajax inception"을 수행합니다. 여기서는 동일한 페이지를 아약스로하지만 이번에는 요청 매개 변수로 해시 값으로 빠른 아약스 스크립트를 렌더링합니다 . 이상하게 느껴진다 .. 아마도 더 좋은 방법이 있지만 내가 본 모든 방법은 해키처럼 보인다
— Gisheri

7

내 대답은 아니오 야.

해시의 주요 목적은 책갈피를 정의한 페이지의 특정 부분으로 스크롤하는 것입니다. 예를 들어 페이지가로드 될 때이 파트로 스크롤하십시오.

찾아보기는이 줄이 줄 아래에 오는 내용의 양에 따라 페이지에서 가장 먼저 볼 수있는 내용이되도록 스크롤합니다.

예, 자바 스크립트가 액세스 할 수 있으며 간단한 아약스 호출로 마술을 수행합니다.


4

이건 어떤가요:

#hash를 동적으로 잡아라

<script>
var urlhash = window.location.hash, //get the hash from url
    txthash = urlhash.replace("#", ""); //remove the #
    //alert(txthash);
</script>

<?php
$hash = "<script>document.writeln(txthash);</script>";
echo $hash;
?>

더 유창하게 만들려면 :

Javascript와 PHP를 사용한 전체 예제

<script>
var urlhash = window.location.hash,  //get the hash from url
txthash = urlhash.replace("#", "");  //remove the #

function changehash(a,b){
   window.location.hash = b; //add hash to url
   //alert(b); //alert to test
   location.reload(); //reload page to show the current hash
}
</script>

<?php $hash = "<script>document.writeln(txthash);</script>";?>

<a onclick="changehash(this,'#hash1')" style="text-decoration: underline;cursor: pointer;" >Change to #hash1</a><br/>
<a onclick="changehash(this,'#hash2')" style="text-decoration: underline;cursor: pointer;">Change to #hash2</a><br/> 

<?php echo "This is the current hash: " . $hash; ?> 

PHP는 여전히 해시 값을 얻지 못합니다.
— 코너 노트

달콤하고 짧은 해결책.
— Waruna Manjula

3

해시 값은 클라이언트 측에서만 사용되므로 PHP로는 얻을 수 없다고 생각합니다.

그래도 자바 스크립트로 PHP로 리디렉션 할 수 있습니다.


1
<?php
$url=parse_url("http://domain.com/site/gallery/1?user=12#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
?>

이것은 작동해야합니다


문자열로 URL을 가지고 있다면 reg exp로 구문 분석하더라도 쉽습니다. 문제는 서버에서 # photo45에 액세스 할 수 없다는 것입니다 (phpinfo () 사용). # photo45는 어디에도 표시되지 않습니다.
— Nik Chankov


1

그래 넌 할수있어:

이 방법을 사용하여 오류를 방지하십시오.

<script> 
query=location.hash;
document.cookie= 'anchor'+query;
</script>

그리고 물론 PHP에서, 그 강아지를 폭발시키고 가치 중 하나를 얻으십시오

$split = explode('/', $_COOKIE['anchor']);
print_r($split[1]); //to test it, use print_r. this line will print the value after the anchortag

0

또 다른 해결책은 숨겨진 입력 필드를 PHP 페이지에 추가하는 것입니다.

<input type="hidden" id="myHiddenLocationHash" name="myHiddenLocationHash" value="">

javascript / jQuery를 사용하여 페이지로드 또는 이벤트에 응답 할 때이 필드의 값을 설정할 수 있습니다.

$('#myHiddenLocationHash').val(document.location.hash.replace('#',''));

서버 측 PHP에서는 $ _POST 컬렉션을 사용하여이 값을 읽을 수 있습니다.

$server_location_hash = $_POST['myHiddenLocationHash'];

0

우리는 다른 접근 방식으로도 할 수 있습니다. 먼저 js에서 해시 값을 가져 와서 해당 매개 변수를 사용하여 ajax를 호출하고 원하는 모든 작업을 수행 할 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.