9

server.comphpファイルが1つしかindex.phpない(ディレクトリ構造がない)Webサーバー(nginx)があるとします。server.com以降は何にでもアクセスできるようにしたいと思います。これはURL構造になります。たとえば、server.com / google.com、server.com/yahoo.com.auなど...

例は次のようになります( /google.comhttp://whois.domaintools.com/google.comという名前のディレクトリはありませんよね?)

Q1:index.phpから「server.com」の後にあるものにアクセスするにはどうすればよいですか?

Q2:そのようなURLからプロトコルを取得できますか?たとえばserver.com/http://www.google.comまたはserver.com/https://www.google.com

PSここで仮想ディレクトリという用語が正しく使用されている かどうかはわかりません。どこかで見たことをやりたいだけです。

4

5 に答える 5

11
location / {
    rewrite ^/(.*)$ /index.php?q=$1
}

location = /index.php {
    #Do your normal php passing stuff here now
}

それはあなたが探していたものですか?

2番目の質問への回答として、phpでプロトコルを解析できます。Nginxはそれを行う必要はありません。URLを解析するには、parse_url関数を使用できます

于 2012-07-20T01:46:27.657 に答える
7

まあ、matzahboyとVBartは、URLをGET変数に書き換える方法を正しく示すnginx構成の抜粋をすでに提供しています。ただし、これを使用するには、で提供される値を解釈する必要があります$_GET['q']。従うルールを指定していないので、ここに提案があります。

この順序でテストするには:

  1. PHPの検証フィルターを使用したRFC2396に準拠した有効なURL:cURLでテストし、HTTP応答コードが400未満の場合はTRUEに応答し、それ以外の場合はFALSEに応答します。
  2. (host。)example.com/path(プロトコルがありません):HTTPプロトコルを想定し、#1ごとにテストします。
  3. host.example.com(ホスト名のみ):#2と同じ
  4. example.com(ドメインのみ):#2としてテストしてから、 www.example.comとしてテストします。
  5. それ以外は:失敗します。

それがあなたにとって理にかなっているなら、次の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で処理されるビットとは別にコーディングする必要があります。

于 2012-07-20T03:47:08.770 に答える
7
location / {
    try_files $uri @dynamic;
}

location @dynamic {
    fastcgi_pass backend;

    include fastcgi_params;
    fastcgi_param  PATH_INFO        $uri;
    fastcgi_param  SCRIPT_NAME      /index.php;
    fastcgi_param  SCRIPT_FILENAME  /absolute/path/to/index.php;
}

fastcgi_paramsファイルはnginxにバンドルされています

$ cat fastcgi_params

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

#fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

$_SERVERまた、PHPの組み込み配列を使用して、これらすべてのfastcgi環境パラメーターにアクセスできます。http://php.net/manual/en/reserved.variables.server.php


于 2012-07-20T15:55:38.040 に答える
3

matzahboyのnginxコードの使用:

location / {
     rewrite ^/(.*)$ /index.php?q=$1
}

次のPHPコードと一緒に:

$basis = array(
    'scheme' => 'http',
);

$info = array_merge( $base, parse_url( 'www.google.com' ) );

print_r( $info );

たとえば、example.com/google.comまたはexample.com/http://google.com/のようなものが返されます

Array ( [scheme] => http [path] => www.google.com )

$base配列には「http」の「scheme」値が含まれていることに注意してください。これにより、schemeの値がデフォルトになり、後で次のようなことができるようになります。

$info['scheme'] . '://' . $info['path'];

その結果、http://google.com/になります

これがあなたの完全な質問に答えることを願っています。

于 2012-07-23T08:13:49.867 に答える
2

書き直しを考えたことはありますか?私はApacheのルールしか知りません。Apacheでは、次のようにします。

RewriteCond $1 !^(index\.php|js|css|admin|images|img|png|robots\.txt|sitemap\.xml|sitemap\.xml\.gz|sitemap\.kml|robots\.txt|javascripts|style.css)
RewriteRule ^(.*)$ index.php/?page=$1 [L]

これにより、URL内のいずれかが、、、およびその他に$_GET['page']一致する場合を除いて、すべてが(PHP)に渡されます。index.phpjscss

ご不明な点がございましたら、お気軽にお問い合わせください。これがお役に立てば幸いです。

于 2012-07-21T15:27:02.220 に答える