서버 측 애플리케이션 (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.