Vánoční nadílka Vánoční nadílka
Vánoční akce! Daruj lepší budoucnost blízkým nebo sobě. Až +50 % zdarma na dárkové poukazy. Více informací

Diskuze: URL - %2F

C# .NET .NET (C# a Visual Basic) URL - %2F American English version English version

Aktivity (3)
Avatar
Vakos
Redaktor
Avatar
Vakos:20. listopadu 22:33

Ahoj,

dělám jeden projekt v ASP NET Core, který běží na linuxu na apache. Mám tam ale problém s url a to přesně s %2F, což je lomítko. Linux to ale nějak neví a tak nic nezobrazí.

Neděje se to však vždy. V routes mám různá pravidla že když za doménou něco bude, tak se to zpracuje tak a tak a to funguje jak má. Problém je ale u tohoto:

routes.MapRoute(
        name: "gallery",
        template: "gallery/{*url}",
        defaults: new { controller = "Gallery", action = "Details" });

Mělo by to fungovat tak, že když za doménou bude napsané gallery, tak vše za lomítkem vezme jako parametr se kterým dále pracuje. Zde nastává ten problém, že v parametru je lomítko a místo lomítka to tam vkládá %2F.

Zkusil jsem: Zkoušel jsem různé úpravy a také googlit, ale zatím jsem nedošel k výsledku, který bych potřeboval.

Chci docílit: Nevíte jak toto vyřešit, aby se mi místo %2F zobrazovalo lomítko a vše se načetlo správně?

Odpovědět 20. listopadu 22:33
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
Vakos
Redaktor
Avatar
Vakos:20. listopadu 23:22

Zjistil jsem novou skutečnost. Problém nastává, když url skládám ve view. Alternativa je to celé překopat, ale měl bych tam téměř duplicitní věci, což je škoda.
Pro úplnost problém nastává zde

asp-route-id="@ViewBag.ParentURL/@item.URL"

Lomítko se přeloží na %2F. Zkoušel jsem to i přes pomocnou proměnnou vytvořenou ve view, ale problém stále přetrvává.

Nahoru Odpovědět 20. listopadu 23:22
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
Vakos
Redaktor
Avatar
Vakos:21. listopadu 9:34

Další poznatek. Pokud si url vytvořím do pomocné proměnné

string link = @ViewBag.ParentURL + @Html.Raw("/") + @item.URL;

Po výpis někde na stránku se vše zobrazí jak má. Bohužel při předávání asp-route-url="@link" to nepředá lomítko, ale %2F.

Nahoru Odpovědět 21. listopadu 9:34
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21. listopadu 14:36

:)
Ten preklad je samozrejme spravny.

Konvertovani do toho tvaru vypada nejak takto:

// js
function escapeUrl(str)
{
var func;
func = encodeURIComponent || encodeURI || escape;
return func(str);
//encodeURIComponent(value).replace(/!/g,'%21').replace(/'/g,'%27').replace(/\(/g,'%28').replace(/\)/g,'%29').replace(/\*/g,'%2A').replace(/%20/g,'+');
}

// php
function escapeUrl($str) {return urlencode($str);}
function unescapeUrl($str) {return urldecode($str);}
<script>
a = '@ViewBag.ParentURL/@item.URL';
b = '@ViewBag.ParentURL/@item.URL';
url = 'xxx?a=' + escapeUrl(a) + '&b=' + escapeUrl(a);
link = '<a href="'+escapeHTML(url)+'">'
</script>

Tvuj php/asp script by to mel umet dekodovat automaticky. Pokud ne, je ta volba vypnuta nekde v nastaveni asp a musis to dekodovat funkci, viz moje unescapeUrl.
Nebo, jakym zpusobem, kde se to pokousis dekodovat?

 
Nahoru Odpovědět 21. listopadu 14:36
Avatar
Vakos
Redaktor
Avatar
Odpovídá na Peter Mlich
Vakos:21. listopadu 17:40

Moc tě nechápu. Dle toho co píšeš, tak je správně, že / se hodí na %2F. Dle mého zjištění, co jsem psal, tak stane se to pouze když se to předává jako parametr, když si proměnnou v šabloně vypíšu, tak se zobrazí vše jak má.

Dále je pak divné, že když jsem si ve funkci, která přebírala parametr zkoušel detekovat zda je tam %2F, tak mi to nikdy nenašlo, protože už tam nebylo %2F, ale /. Na windows se vše načetlo jak má (v url bylo %2F), ale na linuxu nic. Hodilo to ale chybu, že to nenašlo stránku pod url tou a tou a zase zde bylo %2F, ale /.

To co se děje na windows, že je v url %2F a načte se mi nevyhovuje, protože prostě pro uživatele to vypadá blbě, ale aspoň to jede.

Nahoru Odpovědět 21. listopadu 17:40
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
don.jarducius:21. listopadu 19:13

Ahoj,
při zpracování View ti MVC v atributech automaticky escapuje zapisované údaje. Proto ti přeloží / na %2F, můžeš použít Html.Raw pro zápis ve View, nebo HttpUtility.Ur­lDecode pro dekódování před zpracováním při obsluze.
takže by zápis byl asp-route-id="@Html.Raw(Vi­ewBag.ParentUR­L+"/"+item.UR­L)"

 
Nahoru Odpovědět 21. listopadu 19:13
Avatar
Vakos
Redaktor
Avatar
Odpovídá na don.jarducius
Vakos:21. listopadu 19:37

Bohužel to tady pracuje ještě nějak jinak. Kdyby to tak fungovalo, tak jak píšeš, tak už bych to to dávno měl.

Raději jsem ale vše zkoušel znovu a to jak Html.Raw, tak HttpUtility.Ur­lDecode. Vše mělo stejný výsledek, tedy %2F.

Nahoru Odpovědět 21. listopadu 19:37
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
don.jarducius:21. listopadu 20:00

I zpracování v controlleru proměnné url pomocí HttpUtility.Ur­lDecode? Může to totiž dělat i to zpracování zbytku url do proměnné...

 
Nahoru Odpovědět 21. listopadu 20:00
Avatar
don.jarducius:21. listopadu 20:04

Když jsem dělal něco podobného používal jsem na to vlastní "router", něco jako toto kde jsem si rovnou překládal a routoval na controllery

 
Nahoru Odpovědět 21. listopadu 20:04
Avatar
Vakos
Redaktor
Avatar
Odpovídá na don.jarducius
Vakos:21. listopadu 20:14

Je to chyba routeru? Když je to zadané správně, tak i na linuxu to funguje jak má. Problém vidím v předávání těch parametrů.
I v controlleru jsem to dělal a nic. Když bych to ale upravoval v conrolleru, tak se mi nezmění tvar url, který potřebuji ne?

Nahoru Odpovědět 21. listopadu 20:14
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
don.jarducius:23. listopadu 19:48

Je to problém renderování. Z attributu asp-route-id to escapuje, kdežto když to vložíš do href, tak to nechá pa pokoji.

 
Nahoru Odpovědět  +1 23. listopadu 19:48
Avatar
Vakos
Redaktor
Avatar
Odpovídá na don.jarducius
Vakos:23. listopadu 22:16

ok, takže je třeba vytvořit vlastní router? Máš s tím nějak víc zkušeností, zda vše musí být zahrnuto ve vytvořeném, nebo to jde i nakombinovat se stávajícím? Současné řešení dělá vše co chci, jen blbne to escapovaní.

Nahoru Odpovědět 23. listopadu 22:16
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
Vakos
Redaktor
Avatar
Vakos:8. prosince 10:10

Problém vyřešen novou verzí ASP NET Core 2.2.
V dřívějších verzích byla pouze verze, která encoduje lomítka

[Route("{*url}")]

Nyní je tam už je i verze, která to nedělá. Liší se to v hvězdičkách

[Route("{**url}")]
Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět  +1 8. prosince 10:10
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.