[PHP] Redirect met anchor + file upload gaat mis

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het probleem is als volgt:
Ik heb een formulier met als eigenschap enctype="multipart/form-data", het formulier bevat ook een file veld.
Nadat het formulier gesubmit wordt is het de bedoeling dat de gebruiker naar een andere pagina wordt geredirect, en om te zorgen dat de gebruiker ziet wat hij heeft gedaan moet hij onderaan de pagina terecht komen. Dit wordt gedaan via een anchor.

Het probleem is dat als het formulier zowel een enctype="multipart/form-data" als een file veld bevat er bij de redirect het anchor verloren raakt. Haal een van 2 weg (of allebei) en de anchor blijft er wel.

Voorbeeldcode:
test.php
code:
1
2
3
4
5
6
<html>
 <form action="test2.php" method="post" enctype="multipart/form-data">
  <input type="file" name="testfile">
  <input type="submit" value="Test">
 </form>
</html>


test2.php
code:
1
2
3
4
<?php
    header("location: test.php?p=1#1");
    exit();
?>


Natuurlijk is dit probleem gemakkelijk op te lossen door de redirect te vervangen door bijvoorbeeld een meta refresh of een javascript redirect (of een van de andere manieren waarop je een redirect kan maken)

Maar een easy-fix is niet iets wat ik zoek, ik wil weten of dit een bug is of dat het een probleem is wat niet opgelost kan worden.

Dit is getest op:
Windows bak met Apache 1.3 en PHP 4.3.4
Windows bak met Apache 2 en PHP 4.3.6
Windows bak met IIS 5 en PHP 4.3.3
Linux bak met Apache 2 en PHP 4.3.3
Windows bak met Apache 2 en PHP 5 RC1

[ Voor 32% gewijzigd door Verwijderd op 17-04-2004 01:03 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
*kick*

Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 23-08 22:47

dArtagnan

Een voor allen, allen voor een

Je kunt een anchor niet verzenden met een php-header.

edit:

Sorry, ik zat te denken aan het uitlezen van een [url=][rml][ php] waarde achter de # uitlezen[/rml]niet kunnen uitlezen van een #anchor met php[/php] en dat die daarom ook niet verzonden kon worden |:(
Maar dit kan natuurlijk wel. (laat ik het er maar op houden dat het laat was ;))

[ Voor 76% gewijzigd door dArtagnan op 18-04-2004 13:12 ]


Acties:
  • 0 Henk 'm!

  • Joen
  • Registratie: Juli 2003
  • Laatst online: 09-08 18:34
Idd, en mijn inziens ben je ene beetje dom bezig. :P
Ik heb het zelf niet geprobeerd (dus misschien geef ik ook wel een dom antwoord nu :P ), maar try this:
code:
1
2
3
4
5
6
7
<html>
 <form action="test.php#1" method="post" enctype="multipart/form-data">
 <input type="hidden" name="p" value="1"> 
 <input type="file" name="testfile">
  <input type="submit" value="Test">
 </form>
</html>
En laat alles gewoon in test.php zelf doen (of in die test2.php).
Je kan ook in test2.php zetten:
code:
1
<body onload="location.href='#1'">
Of iets in JavaScript in ieder geval. Het gaat er om dat die anchor zich dan ook op test2.php bevind.
Als je goed script heb je jouw ingewikkelde constructie uit je topicstart dus niet nodig.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok, ff iets beter lezen...

De scripts die ik geef zijn voorbeeldscripts van een fictieve situatie om het probleem duidelijk te maken. De feitelijke scripts zijn enkele honderden regels lang en zijn dus niet zo handig om ze hier te posten.

Dat er in test2.php geredirect wordt naar test.php is gewoon zodat je gemakkelijk alles kan testen, in feite wordt er geredirect naar een andere pagina als waar je vandaan kwam. Er worden ook gegevens via de post meegegeven alsmede via de get.

Maar zoals ik zei heeft dit er allemaal helemaal niets mee te maken, zoals ik zei:
Natuurlijk is dit probleem gemakkelijk op te lossen door de redirect te vervangen door bijvoorbeeld een meta refresh of een javascript redirect (of een van de andere manieren waarop je een redirect kan maken)

Maar een easy-fix is niet iets wat ik zoek, ik wil weten of dit een bug is of dat het een probleem is wat niet opgelost kan worden.
Koraalduivel schreef op 18 april 2004 @ 01:50:
Je kunt een anchor niet verzenden met een php-header.
Allemachtige Koraalduivel... als we jou toch niet hadden, en geen voordeur, dan liep iedereen naar binnen. |:(

Hoe kom je hier in godsnaam bij? Natuurlijk kan je wel een anchor verzenden in een PHP header...

Zoals ik zei:
Haal een van 2 weg (of allebei) en de anchor blijft er wel.

[ Voor 40% gewijzigd door Verwijderd op 18-04-2004 02:47 ]


Acties:
  • 0 Henk 'm!

  • Joen
  • Registratie: Juli 2003
  • Laatst online: 09-08 18:34
Bij de action misschioen test2.php#1 gebruiken dan:
code:
1
2
3
4
5
6
<html>
 <form action="test2.php#2" method="post" enctype="multipart/form-data">
  <input type="file" name="testfile">
  <input type="submit" value="Test">
 </form>
</html>
En die anchor-link uit die location-header halen:
code:
1
2
3
4
<?php
    header("location: test.php?p=1");
    exit();
?>
Een anchorlink kan niet in location-headers, daar de anchorlink clientsided is en nietserversided. ;)
Dat jij 1 van die 2 weghaalde en dat het oen wel lukte vind ik dus nogal een vaag verhaal...

Edit:
Het W3C beschijft ook dat je alleen maar URI's kunt gebruiken en niet clientsided anchors:
http://www.w3.org/Protoco...c2616-sec14.html#sec14.30

[ Voor 26% gewijzigd door Joen op 18-04-2004 02:35 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
JeroenM_tbs schreef op 18 april 2004 @ 02:33:
Bij de action misschioen test2.php#1 gebruiken dan:
code:
1
2
3
4
5
6
<html>
 <form action="test2.php#2" method="post" enctype="multipart/form-data">
  <input type="file" name="testfile">
  <input type="submit" value="Test">
 </form>
</html>
En die anchor-link uit die location-header halen:
code:
1
2
3
4
<?php
    header("location: test.php?p=1");
    exit();
?>
Een anchorlink kan niet in location-headers, daar de anchorlink clientsided is en nietserversided. ;)
Dat jij 1 van die 2 weghaalde en dat het oen wel lukte vind ik dus nogal een vaag verhaal...
Voor zover ik weet worden headers gewoon naar de browser gestuurd en zijn headers dus per definitie niet client-side of server-side, maar maken ze deel uit van de communicatie tussen de 2.

Er staat naar mijn weten nergens dat een anchorlink niet in een location header zou kunnen. Anchorlinks werken altijd, behalve in deze situatie.

Edit:

LOL @ W3C.... sinds wanneer houdt IE zich aan W3C...

Ik snap je reactie ook niet helemaal.
Wat schiet ik er mee op als ik submit met een anchor naar een script wat geen output geeft maar alleen een redirect om vervolgens in die redirect alsnog m'n anchor kwijt te raken.

Volgens mij worden hier op GoT ook redirect headers gestuurd met anchors, als ik reply bijvoorbeeld.

Er staat bij W3C ook niet specifiek dat anchors geen deel uitmaken van een URI.
Waarom zou een GET wel een deel zijn van een URI en dan een anchor niet? Een anchor is gewoon een gedeelte van de URL dat geparsed wordt door de browser.

Shit... ik test het net onder Firebird... daarbij werkt het wel. Het lijkt dus een IE probleem te zijn en geen PHP probleem.

Eens ff testen met de nieuwste IIS onder Windows 2003 Advanced server en ASP VBScript, als het probleem zich daar ook voordoet (wat ik vermoed van wel) dan zal ik Microsoft eens mailen, meestal fixen ze dit soort kleine problemen erg snel of mailen ze je terug met de reden waarom ze dit niet fixen of dat ze al bezig zijn met een oplossing. Heeft toch voordelen om MSDN member te zijn :p

[ Voor 83% gewijzigd door Verwijderd op 18-04-2004 03:00 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Verwijderd schreef op 18 april 2004 @ 02:36:
LOL @ W3C.... sinds wanneer houdt IE zich aan W3C...
In het geval van communicatie-protocollen zullen ze wel moeten, anders zou hun software niet (goed) werken met 95% van alle webservers.

En on-topic:

Een server kan wel in een header een anchor verwerken, maar een client is niet verplicht een anchor terug te sturen als de 'anchored link' een nieuwe pagina opvraagt. Een 'get' is logischerwijs wel deel van een URI, aangezien je een webpage op 2 manieren op kunt vragen, middels een GET of middels een POST request.

Kun je niet linken naar website.bla/file.php?jouwvar=bla&anchor=385#385. Zo kun je toch gebruik maken van je anchor voor je clientside prul, en kun je ook daarna de variabele nog terug naar de server krijgen.

Oh, de afwezigheid van die anchor terug posten/getten naar de server is dus geen bug, en eerlijk gezegd betwijfel ik of het wel terugsturen als een feature mag worden gezien.

[ Voor 56% gewijzigd door Grijze Vos op 18-04-2004 04:14 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info

Pagina: 1