답변:
주요 문제는 브라우저가 조각 부분으로 요청을 보내지 않는다는 것입니다. 조각 부분은 브라우저에서 바로 해결됩니다. JavaScript를 통해 접근 할 수 있습니다.
어쨌든 parse_url ()을 사용하여 조각 부분을 포함하여 URL을 비트로 구문 분석 할 수는 있지만 분명히 그렇지는 않습니다.
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는 클라이언트 전용이기 때문에 조각 정보를받지 못한다고 생각합니다.
예, 서버에 앵커 부분이 없습니다. 그러나 쿠키를 사용하는 해결 방법이 있습니다. 여기에서 찾을 수 있습니다 : http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/
이건 어떤가요:
#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
$url=parse_url("http://domain.com/site/gallery/1?user=12#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
?>
이것은 작동해야합니다
URI 다음 부분은 #
"fragment"라고하며 클라이언트 측에서만 정의 / 사용 가능합니다 ( https://en.wikipedia.org/wiki/Fragment_identifier 참조 ).
클라이언트 측에서는 javaScript를 사용하여 액세스 할 수 있습니다 window.location.hash
.
또 다른 해결책은 숨겨진 입력 필드를 PHP 페이지에 추가하는 것입니다.
<input type="hidden" id="myHiddenLocationHash" name="myHiddenLocationHash" value="">
javascript / jQuery를 사용하여 페이지로드 또는 이벤트에 응답 할 때이 필드의 값을 설정할 수 있습니다.
$('#myHiddenLocationHash').val(document.location.hash.replace('#',''));
서버 측 PHP에서는 $ _POST 컬렉션을 사용하여이 값을 읽을 수 있습니다.
$server_location_hash = $_POST['myHiddenLocationHash'];
www.example.com/?val=1#part2
하기 위해 다음www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2
과 같이 서버에서 리디렉션해야합니다. 물론 다른 페이지의 다른 URL로 리디렉션하려면 지원을 추가해야합니다. 굉장하지는 않으며 물론 모든 사용 사례에서 작동하지는 않지만 책갈피에서는 작동합니다. 이렇게하면 안전하지 않은 리디렉션으로 연결