ウェブサイトで多くのディレクトリリストを使用しており、.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
アイテムを機能的なリンクにしたいのですが。
これを「自動的に」行う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スクリプトはどこにでも存在できることに注意してください。ドキュメントルートに移動する必要はありません。 (実際、このスクリプトがファイルシステムの別のサブディレクトリにある場合、実際には望ましいでしょう。スクリプトには既にファイルシステムの絶対パスが渡されているため、スクリプト自体の場所は関係ありません。)別の場所のスクリプトでは、RewriteRule
substitution(つまり、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ショートカットファイル。
将来の参考のために私のソリューションをここに入れます:
ステップ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
を設定することを忘れないでください。)