web-dev-qa-db-fra.com

Transformer les raccourcis .URL en liens fonctionnels dans une liste de répertoires

J'utilise beaucoup de répertoires sur mon site Web et je veux transformer les fichiers de raccourci .URL en liens fonctionnels. Ces raccourcis .URL ont été créés en faisant glisser les icônes des sites Web de la barre d’URL de Firefox vers le bureau Windows.

Le problème: En cliquant sur un élément .URL à partir d'une liste de répertoires du navigateur, seuls les paramètres du fichier (y compris l'URL, voir ci-dessous) sont affichés. charger le site.

Comment faire en cliquant sur un élément .URL pour charger le site Web?

J'ai recherché toutes les combinaisons de mots clés auxquelles je pouvais penser, mais je n'ai trouvé aucune réponse. Le plus proche était une question similaire (mais sans réponse) sur StackOverflow: raccourci d’URL dans Web Directory

Une autre limitation est que j'ai partagé un hébergement Linux à partir de GoDaddy et n’ai donc pas accès à tous les paramètres du serveur "bells and whistles".


. Fichiers URL

Le fichier de raccourci Internet Windows .URL est un fichier INI de la forme suivante, qui contient l'URL cible dans la clé URL.

[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

Exemple en direct

Dans le répertoire: http://SoSaysSunny.com/Eclipse_2017-08-21/
... J'aimerais que les éléments .URL soient des liens fonctionnels.

5
SoSaysSunny

Je ne suis pas au courant d'une manière spécifique à Apache de le faire "automatiquement".

Cependant, il est assez trivial d’écrire cela vous-même. Vous pouvez utiliser le module Apache "mod_rewrite" (dans .htaccess) pour réécrire ces demandes dans un script PHP qui analyse l'URL cible pour générer la redirection.

Par exemple, dans votre fichier racine .htaccess, incluez les éléments suivants (directives mod_rewrite):

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: L'indicateur NS est requis s'il est utilisé avec les listes de répertoires générées par Apache, en particulier si vous spécifiez des icônes personnalisées (AddIcon) et des descriptions (AddDescription) avec l'option FancyIndexing d'Apache (comme ci-dessus). Cela évite que la directive ne soit traitée lors de sous-demandes internes. Voir ma réponse à cette question suivante pour plus d'informations.

Cette opération réécrit toutes les demandes d’URL se terminant par .url ou .URL (non sensible à la casse) et mappant également vers des fichiers existants, dans le fichier PHP /process-url-shortcut.php racine du document) qui traite finalement la demande. Cela définit également une variable d'environnement, URL_FILE, qui contient le chemin d'accès complet du système de fichiers du fichier demandé. (Notez que cela devient REDIRECT_URL_FILE après la réécriture interne - voir la note complémentaire ci-dessous.)

Addtional ... Notez que le script PHP peut exister n'importe où, il n'a pas besoin d'être inséré dans la racine du document. (En fait, il serait préférable que ce script se trouve dans un sous-répertoire situé ailleurs sur le système de fichiers. Le script est déjà passé avec un chemin d'accès absolu au système de fichiers; son emplacement n'a donc pas d'importance.) script ailleurs, il vous suffit de mettre à jour la RewriteRulesubstitution (c.-à-d. process-url-shortcut.php - l'URL cible). Par exemple, si le script se trouvait dans un sous-répertoire /scripts de la racine du document, vous pouvez modifier process-url-shortcut.php pour qu'il lise /scripts/process-url-shortcut.php à la place - le préfixe de barre oblique de l'URL est facultatif dans cet exemple. , car nous l’avons déjà spécifié dans la directive RewriteBase. Notez que vous ne devez pas spécifier d'URL absolue ici (c'est-à-dire avec un schéma + nom d'hôte) car cela déclenchera implicitement une redirection externe, par opposition à une réécriture interne, qui n'est pas ce que nous voulons.

La variable d'environnement est utilisée ultérieurement par notre script PHP. Nous pourrions calculer le nom de fichier à l’aide de PHP. Toutefois, quelques lignes de code seraient nécessaires pour analyser le nom de fichier à partir de l’URL demandée. Cela semblait plus facile et peut-être plus fiable de saisir cela avec le mod_rewrite d'Apache, qui connaît déjà le nom de fichier absolu vers lequel la requête originale est mappée (c'est-à-dire notre fichier URL). Cela fournit également un moyen simple de bloquer les requêtes directes adressées à notre script PHP; Si la variable d'environnement n'est pas définie, le script est demandé directement. Bloquez-le. Deux oiseaux; une pierre.

Le script PHP /process-url-shortcut.php gère ensuite la requête:

<?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>

Ceci recherche le premier url=<something> dans le fichier demandé (non sensible à la casse), en utilisant une expression régulière. Et extrait <something> à utiliser dans la redirection HTTP.

Notez que cela ne contient que la validation minimale. Vous pouvez vérifier que l'URL cible ressemble à une URL, limiter les URL cibles à certains domaines, restreindre les répertoires analysés pour les fichiers .url. etc.


J'allais utiliser la fonction parse_ini_file() de PHP pour extraire la valeur de la clé URL; toutefois, l'exemple "fichier INI" donné dans la question ne semble pas conforme à la spécification PHP attendant:

Avertissement: erreur de syntaxe , inattendue '=' dans ... à la ligne 5

Ce qui semble se rapporter au == qui apparaît plus tard sur la ligne IconFile.


Notes complémentaires...

Le php "REDIRECT_URL_FILE" ne correspond pas à .htaccess "E = URL_FILE"

Oui c'est correct. C'est en effet un peu déroutant (surtout si vous n'êtes pas familiarisé avec le fonctionnement du moteur de réécriture). Tandis que nous définissons la variable d'environnement URL_FILE au moment de la réécriture de l'URL, Apache la renomme en REDIRECT_URL_FILE après la réécriture. En fait, toutes les variables d’environnement qui existaient avant la réécriture sont précédées du préfixe REDIRECT_ après la réécriture (c’est-à-dire, après cette étape du processus de réécriture, et non littéralement juste après cette directive).

Aussi: j'essaie de créer des liens Web (par exemple, nasa.gov), et non des liens "chemin du système de fichiers complet", si cela fait une différence.

Le "chemin complet du système de fichiers" auquel je fais référence dans ma réponse est simplement le "chemin du système de fichiers" du fichier demandé, c'est-à-dire. le fichier .URL que vous avez sauvegardé dans ce répertoire. Le "chemin d'accès au système de fichiers complet" est simplement requis pour que le script PHP puisse ouvrir et lire ce fichier. Oui, cela crée finalement des "liens Web" vers l'URL spécifiée dans le fichier de raccourci.

3
MrWhite

Mettre ma solution ici pour référence future:

Étape 1 Déposez ceci dans votre .htaccess * ( cela fonctionne même dans les sous-dossiers, je l'utilise également sur un pack d'hébergement partagé sans accès administrateur) :

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

Étape 2 Coller ceci dans ${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}"

(Supprimez le premier exec si vous souhaitez avoir l'option de télécharger le fichier. Notez toutefois que cela entraînera des problèmes sur certains appareils mobiles.)

Étape 3 Vous avez terminé! Les fichiers .url téléchargés sont maintenant des hyperliens dans une liste de répertoires.


* Si vous utilisez Hiawatha, ce script fonctionne également comme un pseudo "gestionnaire CGI":

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

(N'oubliez pas de configurer CGIWrapper, si votre serveur l'utilise.)

1