まあ、matzahboyとVBartは、URLをGET変数に書き換える方法を正しく示すnginx構成の抜粋をすでに提供しています。ただし、これを使用するには、で提供される値を解釈する必要があります$_GET['q']
。従うルールを指定していないので、ここに提案があります。
この順序でテストするには:
- PHPの検証フィルターを使用したRFC2396に準拠した有効なURL:cURLでテストし、HTTP応答コードが400未満の場合はTRUEに応答し、それ以外の場合はFALSEに応答します。
- (host。)example.com/path(プロトコルがありません):HTTPプロトコルを想定し、#1ごとにテストします。
- host.example.com(ホスト名のみ):#2と同じ
- example.com(ドメインのみ):#2としてテストしてから、 www.example.comとしてテストします。
- それ以外は:失敗します。
それがあなたにとって理にかなっているなら、次のindex.phpがあなたを始めるかもしれません:
<?php
function http_response($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, TRUE); // remove body
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$head = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if (!$head) {
return FALSE;
}
if ($httpCode < 400) {
return $url;
} else {
return FALSE;
}
}
function test_string($q) {
if (filter_var($q, FILTER_VALIDATE_URL)) {
// Matches RFC2396, so let's generate a hit.
return http_response($q);
}
elseif (preg_match('/^([a-z0-9][a-z0-9-]+\.)+[a-z]{2,}(:[0-9]+)?\/.+$/', $q)) {
// Matches: (host.)example.com/path
return http_response("http://" . $q);
}
elseif (preg_match('/^([a-z0-9][a-z0-9-]+\.){2,}[a-z]{2,}$/', $q)) {
// Matches: host.example.com
return http_response("http://" . $q . "/");
}
elseif (preg_match('/^([a-z0-9][a-z0-9-]+\.)+[a-z]{2,}$/', $q)) {
// Matches: example.com
$ret=http_response("http://" . $q . "/");
if ($ret === FALSE) {
return http_response("http://www." . $q . "/");
} else {
return $ret;
}
}
else {
return FALSE;
}
}
$q = $_GET['q'];
//$q = $argv[1]; // for command-line testing
$url = test_string($q);
if ($url === FALSE) {
printf("<p>The URL <strong>%s</strong> is invalid.</p>\n", $q);
} else {
printf("<p>The URL is <strong>%s</strong>.</p>\n", $url);
}
これが最も美しい、または最も安全なコードであるとは言いませんが、少なくとも、次のような提供されたURLの分析戦略を実装しています。
http://example.com/https://www.example.net/foo/bar
、
http://example.com/example.org/foo/bar
また
http://example.com/example.org
cURLのgopherサポートが壊れている可能性があり、他のプロトコル(HTTP応答コードを返さない)は上記のコードではサポートされていないことに注意してください。HTTPとHTTPS以外のプロトコルをサポートする必要がある場合は、質問でそのように言ってください。それに応じてPHPを調整します。
具体的には、チェックできるようにするhttp://example.com/ping://host.example.net
のは難しいことではありませんが、cURLで処理されるビットとは別にコーディングする必要があります。