web-dev-qa-db-ja.com

ディレクトリリスト内の機能的なリンクへの.URLショートカットの作成

ウェブサイトで多くのディレクトリリストを使用しており、.URLショートカットファイルを機能的なリンクにしたい。これらの.URLショートカットは、WebサイトのアイコンをFirefox URLバーからWindowsデスクトップにドラッグすることで作成されました。

問題:ブラウザディレクトリリストから.URLアイテムをクリックすると、ファイルのパラメータ(URLを含む、以下を参照)のみが表示されますが、ウェブサイトをロードします。

.URLアイテムをクリックすると、実際にWebサイトが読み込まれますか?

考えられるすべてのキーワードの組み合わせを検索しましたが、答えは見つかりませんでした。最も近いのは、StackOverflowに関する同様の(ただし未回答の)質問でした。 Web DirectoryのURLショートカット

さらなる制限は、GoDaddyからのLinuxホスティングを共有しているため、「ベルとホイッスル」のすべてのサーバー設定にアクセスできないことです。


。URLファイル

Windowsインターネットショートカット.URLファイルは、次の形式の INIファイル であり、URLキーにターゲット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

ライブの例

ディレクトリ内: http://SoSaysSunny.com/Eclipse_2017-08-21/
... .URLアイテムを機能的なリンクにしたいのですが。

5
SoSaysSunny

これを「自動的に」行うApache固有の方法を知りません。

ただし、これを自分でスクリプト化するのはかなり簡単です。 Apacheモジュール「mod_rewrite」(.htaccess)を使用して、ターゲットURLを解析してリダイレクトを発行するPHPスクリプトにそのようなリクエストを書き換えることができます。

たとえば、ルート.htaccessファイルに、以下を含めます(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:NSフラグは、Apacheの生成されたディレクトリリストと一緒に使用する場合に必要です-特にカスタムアイコン(AddIcon)および説明(AddDescription)とApacheのFancyIndexingオプション(上記)。これは、内部サブリクエスト中にディレクティブが処理されるのを防ぐためです。詳細については、 このフォローアップの質問に対する私の答え を参照してください。

これにより、既存のファイルにマッピングされる.urlまたは.URL(大文字と小文字は区別されない)で終わるURLに対するすべてのリクエストが、PHPファイル/process-url-shortcut.php(最終的にリクエストを処理するドキュメントルート)。また、環境変数URL_FILEも設定されます。これには、要求されているファイルの完全なファイルシステムパスが含まれています。 (これは内部書き換え後にREDIRECT_URL_FILEになることに注意してください-以下の追加のメモを参照してください。)

追加...PHPスクリプトはどこにでも存在できることに注意してください。ドキュメントルートに移動する必要はありません。 (実際、このスクリプトがファイルシステムの別のサブディレクトリにある場合、実際には望ましいでしょう。スクリプトには既にファイルシステムの絶対パスが渡されているため、スクリプト自体の場所は関係ありません。)別の場所のスクリプトでは、RewriteRulesubstitution(つまり、process-url-shortcut.php-ターゲットURL)を更新するだけです。たとえば、スクリプトがドキュメントルートの/scriptsサブディレクトリにある場合、process-url-shortcut.phpを変更して/scripts/process-url-shortcut.phpを読み取ることができます。この例では、URLのスラッシュプレフィックスはオプションです。 、これは既にRewriteBaseディレクティブで指定しているためです。ここで絶対URLを指定してはならないことに注意してください(スキーム+ホスト名など)。これはinternal rewriteではなく、暗黙的にexternal redirectをトリガーします。私たちが望むものではありません。

環境変数は、後でPHPスクリプトによって使用されます。 PHPを使用してファイル名を計算できますが、要求されたURLからファイル名を解析するには数行のコードが必要です。 originalリクエストがマップされた絶対ファイル名(つまり、URLファイル)を既に知っているApacheのmod_rewriteでこれを取得する方が簡単で、おそらくより信頼性が高いように見えました。これは、PHPスクリプトへの直接リクエストをブロックする簡単な方法も提供します。環境変数が設定されていない場合、スクリプトは直接要求されているため、ブロックします。 2羽の鳥;一石。

PHPスクリプト/process-url-shortcut.phpはリクエストを処理します:

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

これは、正規表現を使用して、要求されたファイル(大文字と小文字を区別しない)で最初のurl=<something>を探します。そして、HTTPリダイレクトで使用される<something>を抽出します。

これには最低限の検証のみが含まれていることに注意してください。ターゲットURLがURLのように見えることを確認し、ターゲットURLを特定のドメインに制限し、.urlファイルを解析するディレクトリを制限できます。などなど.


PHPのparse_ini_file()を使用してURLキー値を抽出しようとしていましたが、質問で指定された「INIファイル」の例は仕様に準拠していないようですPHPは期待:

警告:構文エラー、5行目の...に予期しない「=」

これは、後でIconFile行に表示される==に関連しているようです。


その他の注意事項...

Php "REDIRECT_URL_FILE"は.htaccess "E = URL_FILE"と一致しません

はい、それは正しいです。これは確かに少し混乱します(特に、書き換えエンジンの動作に慣れていない場合)。 URLの書き換え時に環境変数URL_FILEを設定しますが、Apacheは書き換えが発生した後、これをREDIRECT_URL_FILEに変更します。実際、書き換え前に存在していたすべての環境変数には、書き換え後(つまり、このディレクティブの直後ではなく、書き換えプロセスを通過した後)にREDIRECT_というプレフィックスが付きます。

また、違いがある場合は、「フルファイルシステムパス」リンクではなく、ウェブリンク(例:nasa.gov)を作成しようとしています。

私の答えで言う「ファイルシステムのフルパス」は、要求されている実際のファイルの「ファイルシステムパス」です。そのディレクトリに保存した.URLファイル。 PHPスクリプトがこのファイルを開いて読み取ることができるように、「完全なファイルシステムパス」が必要です。はい、これは最終的に指定されたURLへの「Webリンク」を作成しますwithinショートカットファイル。

3
MrWhite

将来の参考のために私のソリューションをここに入れます:

ステップ1これを.htaccess*(これはサブフォルダでも動作します; I ' m管理アクセスなしで共有ホスティングパッケージで使用する場合も)

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

ステップ2ペースト this${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}"

(ファイルをダウンロードするオプションが必要な場合は、最初のexecを削除します。ただし、これにより一部のモバイルデバイスで問題が発生することに注意してください。)

ステップ3以上です!アップロードされた.urlファイルは、ディレクトリリスト内のハイパーリンクになりました。


* Hiawathaを使用している場合、このスクリプトは疑似「CGIハンドラ」としても機能します。

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

(サーバーが使用する場合、CGIWrapperを設定することを忘れないでください。)

1