URL'nin karma kısmını sunucu tarafı uygulamamda (PHP, Ruby, Python vb.) Okuyabilir miyim?


217

URL'si varsayarsak:

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

PHP val1, GET dizisini kullanarak istek değişkenlerini okuyabilir .

Karma değeri part2de okunabilir mi? Yoksa bu sadece tarayıcıya ve JavaScript'e mi bağlı?

Yanıtlar:


203

Asıl sorun, tarayıcının bir parça parçasıyla bir istek bile göndermemesi. Parça kısmı, burada tarayıcıda çözülür. Bu yüzden JavaScript aracılığıyla erişilebilir.

Her neyse, bir URL'yi parça parçası da dahil olmak üzere parse_url () kullanarak bitlere ayrıştırabilirsiniz , ancak açıkçası durumunuz bu değildir.


98

Basit test, http: // localhost: 8000 / hello? Foo = bar # 'a erişildi, sunucuya gönderilmedi

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 -

Sunucu #appendage olmadan isteği alır - karma etiketinden sonraki her şey istemcide bir çapa aramasıdır.

URL'de kullanılan bağlantı adını javascript aracılığıyla örnek olarak kullanarak bulabilirsiniz:

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

Parçayı içeren gerekli URL dizesine zaten sahipseniz PHP'deki parse_url () işlevi çalışabilir ( http://codepad.org/BDqjtXix ):

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

Output: fizzbuzz

Ancak PHP'nin sadece istemci olduğu için parça bilgilerini aldığını sanmıyorum.


48

Javascript'ten alınabilir - as window.location.hash. Oradan örneğin Ajax ile sunucuya gönderebilir veya kodlayabilir ve daha sonra sunucu tarafına geçirilebilen URL'lere koyabilirsiniz.


1
Teşekkürler! Netleştirmek www.example.com/?val=1#part2 gerekirse , bunun yerine: Sunucuya yeniden yönlendirmeniz gerekir, şöyle: www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 ve elbette diğer sayfanızdaki diğer URL'ye yönlendirmek için destek eklemeniz gerekir. Harika değil ve tüm kullanım durumları için elbette çalışmıyor, ancak yer imleri için çalışıyor. Bunu yaparsanız, kendinizi güvenli olmayan yönlendirmelere
Brad Parks


8

Evet bu doğru, sunucu sabitleme parçasını alamıyor. Ancak, çerezleri kullanan bir geçici çözüm vardır. Burada bulabilirsiniz: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/


2
Bu "geçici çözüm" değersizdir. Sayfa görünümü başına 2 istekle karşılaşırsanız, bir düzine daha iyi teknik vardır.
umassthrower

11
Değersiz mi? Bu kesinlikle değersiz değil. Ama belki daha iyi teknikler var.
Kishor

Daha iyi teknikler nelerdir? Benim google oauth için erişim jeton karma ile api sayfama beni yönlendiriyorum var, sonra ben bir "ajax başlangıç" yapmak nerede burada aynı sayfayı ajax ama karma değeri ile bir istek parametresi olarak ajax hızlı bir ajax komut dosyası oluşturmak . Tuhaf geliyor .. Muhtemelen daha iyi yollar var, ama gördüğüm tüm yollar hacky görünüyor
Gisheri

7

Cevap hayır.

Karma işleminin ana amacı, sayfanın bir yer işareti tanımladığınız belirli bir bölümüne ilerlemektir. Örneğin, sayfa yüklendiğinde bu Bölüme ilerleyin.

Tarama, satırın altında ne kadar içerik izlediğine bağlı olarak, bu satır sayfadaki ilk görünür içerik olacak şekilde kayar.

Evet javascript buna erişebilir ve basit bir ajax çağrısı sihri yapacak


4

Ne dersin:

#Hash'ı dinamik olarak yakala

<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;
?>

Daha akıcı hale getirmek için:

Sadece Javascript ve PHP kullanarak tam örnek

<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 hala karma değerini alamıyor.
cornernote

tatlı ve kısa bir çözüm.
Waruna Manjula

3

Ben karma değeri sadece istemci tarafında kullanılır, bu yüzden php ile elde edemezsiniz düşünüyorum.

php için javascript ile yönlendirebilirsiniz.


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

Bu işe yaramalı


Eğer URL olarak reg exp ile ayrıştırsanız bile, dize olarak url varsa. Sorun şu ki sunucudan # photo45'e erişemiyorsunuz (phpinfo () kullanın ve # photo45'i hiçbir yerde görmeyeceksiniz
Nik Chankov


1

Evet yapabilirsin:

Hataları önlemek için bu yöntemi kullanın:

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

Ve elbette PHP'de, o köpek yavrusu patlatın ve değerlerden birini alın

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

0

Başka bir çözüm php sayfasına gizli bir giriş alanı eklemektir:

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

Javascript / jQuery kullanarak, sayfa yüklemesinde veya bir etkinliğe yanıt verirken bu alanın değerini ayarlayabilirsiniz:

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

Sunucu tarafındaki php'de $ _POST koleksiyonunu kullanarak bu değeri okuyabilirsiniz:

$server_location_hash = $_POST['myHiddenLocationHash'];

0

Bunu başka bir yaklaşımla da yapabiliriz, her şeyden önce js'den hash değerini alın ve bu parametreyi kullanarak ajax'ı çağırın ve istediğimizi yapabilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.