Neočekávané chování při odeslání bookmarkletu nebo související akci databáze

[aktualizováno níže]

Mám trochu problém s nasazením webu na apache s mod_wsgi s nějakou funkcí bookmarkletu javascriptu. Problém je v tom, že bookmarklet (což je tlačítko nabídky prohlížeče) se odešle na stránku jako

http://stemhub.org/submit/http://the-users-link.com/here

který pak vrátí formulář pro uložení metadat o odkazu. Funkce zobrazení (aplikace flask/werkzeug) zkontroluje databázi, aby zjistila, zda byl odkaz již přidán, a poté vrátí formulář s již existujícím nebo nově přiřazeným ID odkazu, což by podle mého názoru mohlo způsobit nějaký problém s načasováním. . Je velmi zvláštní, že když poprvé odešlem odkaz, dostanu http://stemhub.org/submit/http://the-users-link.com/here stránku s chybou Apache „nenalezeno“, ale pokud stránku znovu načtu, dostanu formulář, jak bylo zamýšleno. Protokoly chyb obsahují zprávy o výjimkách z vláken, ale tyto zprávy obsahují i ​​tehdy, když web funguje podle očekávání.

Existuje paralelní nasazení aplikace na jiném portu — stemhub.org:5000 — který běží na Tornado a funguje dobře, stejně jako verze pro místní vývoj.

Zde jsou bookmarklety, je pravděpodobné, že jsou problémem:

pracovní verze portu 5000:

javascript:(function(){window.open('http://stemhub.org:5000/submit/'+encodeURIComponent(window.location.href),'height=200,width=150')}())

Verze problémového portu 80:

javascript:(function(){window.open('http://stemhub.org/submit/'+encodeURIComponent(window.location.href),'height=200,width=150')}())

AKTUALIZACE: Z nějakého důvodu, který patří k jiné značce, změna metody javascriptu encodeURIComponentencodeURI vše funguje tak, jak má, alespoň ve Firefoxu a Chrome. V budoucnu však přijme radu Grahama Dumpletona ohledně něčeho rozumnějšího.

Odpověď

Ať už je váš problém jakýkoli, způsob, jakým vkládáte druhou adresu URL do adresy URL, nebude s Apache fungovat. Je to proto, že Apache sbalí opakující se lomítka do jediného lomítka a toto jediné lomítko je pak vše, co aplikace hostovaná Apache uvidí v PATH_INFO.

Jinými slovy, nejedná se o problém s mod_wsgi a může nastat při použití jiných mechanismů hostování dynamických webových aplikací ve spojení s Apache, dokonce i těch, které nejsou v Pythonu.

BTW, někteří mohou poukazovat na to, že neupravená adresa URL je v REQUEST_URI, ale spoléhat se na to není nutně dobrý nápad, protože řešení, jak to rozdělit a namapovat na SCRIPT_NAME a PATH_INFO, nemusí být vždy přímočaré v závislosti na tom, zda je přepsán pravidla se používají v Apache.

Navrhuji, abyste místo toho prozkoumali, že druhá adresa URL je součástí řetězce dotazu a nikoli cesta adresy URL.