it-swarm.com.de

Machen Sie .URL-Verknüpfungen zu funktionalen Links innerhalb einer Verzeichnisliste

Ich verwende viele Verzeichnisse auf meiner Website und möchte .URL Verknüpfungsdateien in funktionale Links umwandeln. Diese .URL Verknüpfungen wurden erstellt, indem die Symbole der Websites von meiner Firefox-URL-Leiste auf meinen Windows-Desktop gezogen wurden.

Das Problem: Wenn Sie in einem Browser-Verzeichnis auf ein .URL -Element klicken, werden nur die Parameter der Datei (einschließlich der URL, siehe unten) angezeigt, nicht jedoch Laden Sie die Website.

Wie können wir das Klicken auf ein .URL -Element bewirken, um die Website tatsächlich zu laden?

Ich habe jede erdenkliche Keyword-Kombination durchsucht, aber keine Antworten gefunden. Das nächste Problem war eine ähnliche (aber nicht beantwortete) Frage zu StackOverflow: RL-Verknüpfung im Webverzeichnis

Eine weitere Einschränkung ist, dass ich das Linux-Hosting von GoDaddy geteilt habe und daher nicht auf alle Servereinstellungen zugreifen kann.


. URL-Dateien

Die Windows-Internetverknüpfung .URL ist eine INI-Datei der folgenden Form, die die Ziel-URL im Schlüssel URL enthält.

[InternetShortcut]
URL=https://Eclipse2017.nasa.gov/sites/default/files/interactive_map/index.html
IDList=
HotKey=0
IconFile=C:\Users\Sunny\AppData\Local\Mozilla\Firefox\Profiles\ ... ==.ico
IconIndex=0

Live-Beispiel

Im Verzeichnis: http://SoSaysSunny.com/Eclipse_2017-08-21/
... Ich möchte, dass die .URL Elemente funktionale Links sind.

5
SoSaysSunny

Mir ist kein Apache-spezifischer Weg bekannt, dies "automagisch" zu tun.

Es ist jedoch einigermaßen trivial, dies selbst zu skripten. Sie können das Apache-Modul "mod_rewrite" (in .htaccess) verwenden, um solche Anforderungen in ein PHP Skript umzuschreiben, das die Ziel-URL analysiert, um die Umleitung auszustellen.

Enthalten Sie in Ihrer Stammdatei .htaccess beispielsweise die folgenden Anweisungen (mod_rewrite-Direktiven):

Options +Indexes

RewriteEngine On
RewriteBase /

# Rewrite requests for ".url" files to our PHP script
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .\.url$ process-url-shortcut.php [NS,NC,E=URL_FILE:%{REQUEST_FILENAME},L]

UPDATE: Das Flag NS ist erforderlich, wenn dies zusammen mit den von Apache generierten Verzeichnislisten verwendet wird - insbesondere, wenn Sie benutzerdefinierte Symbole angeben (AddIcon) und Beschreibungen (AddDescription) mit der Option FancyIndexing von Apache (wie oben). Dies soll verhindern, dass die Direktive während interner Unteranforderungen verarbeitet wird. Siehe meine Antwort auf diese Folgefrage für weitere Informationen.

Dadurch werden alle Anforderungen für URLs, die auf .url oder .URL enden (ohne Berücksichtigung der Groß - und Kleinschreibung), die auch vorhandenen Dateien zugeordnet sind, in die PHP - Datei /process-url-shortcut.php (im document root), der letztendlich die Anfrage bearbeitet. Hiermit wird auch die Umgebungsvariable URL_FILE festgelegt, die den vollständigen Dateisystempfad der angeforderten Datei enthält. (Beachten Sie, dass dies nach dem internen Umschreiben zu REDIRECT_URL_FILE wird - siehe den zusätzlichen Hinweis unten.)

Weitere ... Beachten Sie, dass das PHP -Skript überall vorhanden sein kann und nicht im Stammverzeichnis des Dokuments gespeichert werden muss. (Tatsächlich wäre es besser, wenn sich dieses Skript in einem Unterverzeichnis an einer anderen Stelle im Dateisystem befände. Dem Skript wurde bereits ein absoluter Dateisystempfad übergeben, daher spielt es keine Rolle, wo sich das Skript selbst befindet.) An einer anderen Stelle müssen Sie nur die RewriteRuleSubstitution (dh process-url-shortcut.php - die Ziel-URL) aktualisieren. Wenn sich das Skript beispielsweise in einem Unterverzeichnis /scripts außerhalb des Dokumentstamms befindet, können Sie process-url-shortcut.php in /scripts/process-url-shortcut.php ändern. In diesem Beispiel ist das Schrägstrichpräfix in der URL optional , weil wir dies bereits in der Anweisung RewriteBase angegeben haben. Beachten Sie, dass Sie hier keine absolute URL angeben dürfen (dh mit einem Schema + Hostnamen), da dies implizit eine externe Umleitung auslöst, im Gegensatz zu einer internen Umschreibung, die ist nicht das, was wir wollen.

Die Umgebungsvariable wird später von unserem Skript PHP verwendet. Wir könnten den Dateinamen mit PHP berechnen, dies würde jedoch einige Codezeilen erfordern, um den Dateinamen von der angeforderten URL zu analysieren. Es schien einfacher und möglicherweise zuverlässiger, dies stattdessen mit Apaches mod_rewrite zu erfassen, das bereits den absoluten Dateinamen kennt, auf den die original -Anforderung abgebildet ist (dh unsere URL-Datei). Dies bietet auch eine einfache Möglichkeit, direkte Anfragen an unser Skript PHP zu blockieren. Wenn die Umgebungsvariable nicht festgelegt ist, wird das Skript direkt angefordert. Blockieren Sie es daher. Zwei Vögel; ein Stein.

Das PHP Skript /process-url-shortcut.php verarbeitet dann die Anfrage:

<?php
// Check for environment variable that contains the URL file being requested
//  - This is set during the internal rewrite in .htaccess
$urlFile = getenv('REDIRECT_URL_FILE');
if ($urlFile) {

    # Read the contents of the URL file
    $urlFileData = file_get_contents($urlFile);
    if ($urlFileData) {

        # Extract just the target URL from the file
        if (preg_match('/url=(.+)/i',$urlFileData,$urlMatch)) {

            # If found a target URL in the file then redirect...
            if (isset($urlMatch[1])) {
                header('Location: '.$urlMatch[1],true,302);
                exit;
            }

        }

    }

}

// If got this far then script was accessed directly or something went wrong...
http_response_code(404);
?>
<h1>404 Not Found</h1>

Dies sucht nach dem ersten url=<something> in der angeforderten Datei (ohne Berücksichtigung der Groß- und Kleinschreibung) unter Verwendung eines regulären Ausdrucks. Und extrahiert <something>, um in der HTTP-Umleitung verwendet zu werden.

Beachten Sie, dass dies nur die Mindestvalidierung enthält. Sie können überprüfen, ob die Ziel-URL wie eine URL aussieht, die Ziel-URLs auf bestimmte Domänen beschränken und die Verzeichnisse einschränken, die für .url -Dateien analysiert werden. usw. usw.


Ich wollte PHPs parse_ini_file() verwenden, um den URL -Schlüsselwert zu extrahieren. Das in der Frage angegebene Beispiel "INI-Datei" scheint jedoch nicht der Spezifikation PHP zu entsprechen erwartet:

Warnung: Syntaxfehler, unerwartetes '=' in ... in Zeile 5

Das scheint sich auf den == zu beziehen, der später in der IconFile -Zeile erscheint.


Zusätzliche Bemerkungen...

Die PHP "REDIRECT_URL_FILE" stimmt nicht mit der .htaccess "E = URL_FILE" überein

Ja, das ist richtig. Dies ist in der Tat etwas verwirrend (insbesondere, wenn Sie nicht mit der Funktionsweise der Rewrite-Engine vertraut sind). Während wir die Umgebungsvariable URL_FILE zum Zeitpunkt des URL-Rewrites setzen, benennt Apache diese nach dem Rewrite in REDIRECT_URL_FILE um. Tatsächlich wird allen Umgebungsvariablen, die vor dem Umschreiben existierten, nach dem Umschreiben das Präfix REDIRECT_ vorangestellt (dh nach diesem Durchlauf des Umschreibprozesses, nicht wörtlich direkt nach dieser Anweisung).

Außerdem: Ich versuche, Weblinks (z. B. nasa.gov) und keine Links mit dem vollständigen Dateisystempfad zu erstellen, wenn dies einen Unterschied macht.

Der "vollständige Dateisystempfad", auf den ich in meiner Antwort verweise, ist nur der "Dateisystempfad" der tatsächlich angeforderten Datei, d. H. Die .URL -Datei, die Sie in diesem Verzeichnis gespeichert haben. Der "vollständige Dateisystempfad" wird lediglich benötigt, damit das Skript PHP diese Datei öffnen und lesen kann. Ja, dadurch werden letztendlich "Weblinks" zu der angegebenen URL erstellt innerhalb der Verknüpfungsdatei.

3
MrWhite

Hier meine Lösung als Referenz für die Zukunft:

Schritt 1 Fügen Sie dies in Ihren .htaccess * ( Dies funktioniert sogar in Unterordnern, ich verwende es auch auf einem gemeinsam genutzten Hosting-Paket ohne Administratorzugriff) :

AddType text/x-url url
Action text/x-url /cgi-bin/url.cgi

Schritt 2 Einfügen von this in ${cgi_bin}/url.cgi:

#!/bin/sh

while read -r line; do
  case "${line}" in
   "URL="*|"http"*)
      url="${line#"URL="}"
      status="302 Found"
      content_type="text/x-url"
      break
      ;;
  esac
done < "${PATH_TRANSLATED="${1}"}"

exec printf "Status: %s\r\n${content_type+"Content-Type: %s\\r\\n"}${url+"Location: %s\\r\\n"}\r\n"\
 "${status?"500 Internal Server Error"}"\
 ${content_type+"${content_type}"}\
 ${url:+"${url}"}

exec cat "${PATH_TRANSLATED}"

(Entfernen Sie das erste exec, wenn Sie die Option zum Herunterladen der Datei haben möchten. Beachten Sie jedoch, dass dies bei einigen Mobilgeräten zu Problemen führt.)

Schritt 3 Fertig! Hochgeladene .url -Dateien sind jetzt Hyperlinks in einer Verzeichnisliste.


* Wenn Sie Hiawatha verwenden, funktioniert dieses Skript auch als Pseudo-CGI-Handler:

CGIHandler=/var/www/cgi-bin/url.cgi:url

(Vergessen Sie nicht, CGIWrapper zu konfigurieren, falls Ihr Server dies verwendet.)

1