Thread Mason und mod_perl: Wieso !$r->main aber !$r->is_initial_req ?? (2 answers)
Opened by flowdy at 2012-10-05 17:40

flowdy
 2012-10-05 17:40
#162478 #162478
User since
2012-08-03
45 Artikel
BenutzerIn

user image
Hallo,

meine Konfiguration: Apache/Linux 2.2.2, mod_perl 2.0.7 und HTML::Mason 1.45

In der Doku zu Apache2::RequestRec steht
Quote
"main"
Get the main request record

$main_r = $r->main();

obj: $r ( "Apache2::RequestRec object" )
ret: $main_r ( "Apache2::RequestRec object" )
If the current request is a sub-request, this method returns a
blessed reference to the main request structure. If the current
request is the main request, then this method returns "undef".

To figure out whether you are inside a main request or a
sub-request/internal redirect, use "$r->is_initial_req".

since: 2.0.00


und daraus hab ich mir den Schluss erlaubt, dass $r->main belegt ist, wenn $r->is_initial_req false liefert. Gilt das nicht für das ErrorDocument?

Folgender Code funktioniert jedenfalls nicht, das spricht gegen meine Logik. Weiß vielleicht jemand Rat?
Code: (dl )
1
2
3
4
5
6
7
%# in /error404.html, verknüpft durch ErrorDocument-Direktive
% if ( my $main = !$r->is_initial_req && $r->main ) {
<li><strong>Hatte die URL <tt><% $main->uri %></tt> in der Vergangenheit funktioniert?</strong><br>
Vielleicht ist sie umgezogen: <form action="forward.cgi"><input type="hidden" name="url" value="<% $main->uri %>"><input type="submit" value="Ggf. weiterleiten"></form></li>
% } else { $m->out("Komisch, is_initial_req ist doch ", $r->is_initial_req); }
<li>Weitere Links zur Wiederfindung...</li>
<li><!-- Weitere Links zur Wiederfindung --></li>


Ausgabe:
Code: (dl )
Komisch, is_initial_req ist doch 0<li><!-- Weitere Links zur Wiederfindung --></li>


Zum Kontext:
Ich möchte in meinem Mason-regierten ErrorDocument (404) die vom Benutzer ursprünglich aufgerufene URL ermitteln. Ich brauche sie, um erst nach Klick auf einen Weiterleiten-Button durch den Nutzer in der Datenbank nachzuschauen, ob es eine Redirect-URL gibt und ggf. auf diese entsprechend weiter zu leiten.
Bisher habe ichs mit $m->redirect($url, 301) gemacht. Leider zögert das das Problem toter Bookmarks und entsprechender Anfragen nur hinaus: Ich kenne keinen Browser am Markt, der dem Nutzer bei einem "HTTP 301 Moved Permanently" diskret den Bookmark aktualisiert oder auch nur darum nachfragt. Warum auch immer. Jedenfalls sehe ich durch diese Situationen keinen rechten Sinn des Status-Codes 301, wahrscheinlich haben nur Suchmaschinen etwas davon.

Daher hab ich mir diese gelinde Lästigkeit überlegt, die der Nutzer eben umgeht, indem er von sich aus manuell den Bookmark aktualisiert, so er einen angelegt hat. Eine statische Vorschaltseite mit Link kommt nicht infrage, da die Redirects in der Datenbank verwaltet und regelmäßig tatsächlich gelöscht werden.


viele Grüße,
flowdy

modedit Editiert von GwenDragon: Code-Tag gesetzt, More enfernt
Last edited: 2012-10-05 17:44:15 +0200 (CEST)
package MyClass; sub new {\b\b\b\b\b\b\b\b\buse Moose;

View full thread Mason und mod_perl: Wieso !$r->main aber !$r->is_initial_req ??