Yorum formunu yeniden gönderilmesini engellemek

3 Cevap php

Ben bir yazı için bir yorum formu var ve ben yeniden gönderilmesini engellemek için olur. Bizim metotları çok benzer olsa da, ben Worpdress (geri gidiş form yeniden gönderme istemek için tarayıcı neden olmaz) çok iyi bu işler fark, ama onlar bunu anlamaya olamaz.

My Script

Kullanıcı ziyaret mydomain.com/article/1/article_title.html

Mesaj mydomain.com/addnewcomment/1.html için bir form doldurur

Ben daha sonra bir 302 mydomain.com/article/1/article_title.html geri yönlendirmek

Ben bu pozisyonda geri tuşuna Şimdi eğer bir yönlendirme talep etmez. Ancak, ben başka bir sayfaya giderseniz mesela mydomain.com/tag/1/my_tag.html ve basın geri formu yeniden yapar.

Açıkçası ben bunu önlemek istiyorum.

What Wordpress does

User visits mydomain.com/?p=1 Fills in a form which posts to mydomain.com/wp-comments-post.php This then does a 302 redirect back to mydomain.com/?p=1

Geri basmak veya başka bir sayfasını ziyaret ve geri tuşuna basarak bir yeniden gönderme neden olmaz.

Ben WP kodu aracılığıyla göz yaşadım ama bu nasıl yönettikleri göremiyorum. Açıkçası ben başarmak istiyorum şey.

Herkes yanlış gidiyor olabilir nereye üzerinde herhangi bir düşünce var mı?

(Ben sadece mümkün olduğunu kanıtlamak için bir örnek olarak Wordpress kullanıyorum, açıkçası ben tam WP çoğaltmak için çalışıyorum değilim, bu anlamsız olurdu)

EDIT - Figured out what it was

Acaba bu hangi başlık tam çivilenmiş değil, ama (gerçekten ben ilk yönlendirme denilen gerekirken, yönlendirme önce bir işlev çağırarak, benim koduyla sorun) yönlendirme yapmadan önce ek başlıkları gönderiyordu.

Ben fonksiyonu taşındı ve yönlendirme önce bu başlıkları gönderme durdu sonra geri gittikten sonra Resubmissions olmadan, iyi çalıştı.

Tabii ki de çiftleri kontrol etmek önemlidir, ama bu hiç ne istediğini bir formu yeniden isteği ile haşhaş tarayıcı durur.

Ben gönderiyordu başlıklar:

Content-Type Last-Modified Etag Content-language Cache-Control Pragma Expires

Ben muhtemelen pragma ile no-cache şey oldu veya önbellek kontrol başlığındaki-revalidate gerekir tahmin ediyorum.

Her iki durumda da aynı sorunu yaşıyorsanız, size yönlendirmenin önce yolluyoruz ne diğer başlıkları kontrol edin.

3 Cevap

Büyük bir rasgele sayı ile forma gizli bir alan eklemek, ya da gerçekten deli gitmek istiyorsanız, ekteki rastgele bir sayı ile bir zaman damgası.

Bu sayı daha önce kullanılmış ise o yazı ve çift kontrol ile bu numarayı saklayın. Eğer öyleyse, repost yoktur.

Bu da PRG çözemez durumların hepsi, yani (wiki) kolları:

  • Bir web kullanıcı web formu geri gider ve onu yeniden gönderir eğer.
  • Bir web kullanıcı sunucu yanıt yüklenmeden önce bir gönderme düğmeye birden çok kez tıklarsa
  • Ilk teslim tamamladı önce bir web kullanıcı yenileniyorsa

Benim tablo satırı anahtarları gibi UUIDs kullanmayı tercih nedeni budur. Böyle bir sorun için, ben gizli bir alan olarak, boş açıklama alanına satır anahtarı oluşturmak istiyorsunuz. Sonra birileri yenilemek için çalışır veya geri & vurursa anahtar zaten varolduğundan INSERT başarısız olur, gönderin.