Hướng dẫn dùng _server path_info trong PHP

Chính xác thì PATH_INFO trong PHP là gì?

tất cả các URL bên ngoài trông giống như 'module / action? key1 = param1'. Không thể tùy chỉnh - nhưng nó rất nhanh. Sự khác biệt là cái đầu tiên sử dụng GET của PHP và cái thứ hai sử dụng PATH_INFO.

Tôi đã nhìn thấy PATH_INFOvài lần, nhưng vẫn không biết chính xác nó là gì. Nó làm gì?

  • php
  • pathinfo

34 hữu ích 0 bình luận 48k xem chia sẻ

answer

45

Trên thực tế, PATH_INFOliên quan đến Máy chủ Web Apache phục vụ các trang PHP chứ không phải PHP.

PATH_INFOlà một biến môi trường do Apache thiết lập khi AcceptPathInfochỉ thị được bật. Nó sẽ chứa thông tin tên đường dẫn theo sau tên tệp thực tế hoặc tệp không tồn tại trong thư mục hiện có, cho dù yêu cầu được chấp nhận hay bị từ chối. Các biến môi trường sau đó được chuyển cho mô-đun Apache / CGI phụ trách việc hiển thị trang.

Có thể truy cập biến trong PHP bằng cách sử dụng $_SERVER['PATH_INFO'].

Ví dụ: giả sử vị trí /test/trỏ đến một thư mục chỉ chứa một tệp duy nhất here.html. Sau đó, yêu cầu cho /test/here.html/more/test/nothere.html/morecả hai thu thập /morenhư PATH_INFO.

Tài liệu cốt lõi của Apache: AcceptPathInfoChỉ thị

45 hữu ích 1 bình luận chia sẻ

answer

21

Vì biến PATH_INFO là một phần của định nghĩa cho CGI, bạn cũng nên xem xét trong đó;]

//tools.ietf.org/html/rfc3875#section-4.1.5

21 hữu ích 0 bình luận chia sẻ

Đăng nhập để trả lời câu hỏi

Có thể bạn quan tâm

answer

135

Có lẽ, vì bạn đang ở trong IIS,

$_SERVER['PATH_INFO']

là những gì bạn muốn, dựa trên các URL bạn đã sử dụng để giải thích.

Đối với Apache, bạn sẽ sử dụng $_SERVER['REQUEST_URI'].

135 hữu ích 4 bình luận chia sẻ

answer

63

$pageURL = [@$_SERVER["HTTPS"] == "on"] ? "//" : "//";
if [$_SERVER["SERVER_PORT"] != "80"]
{
    $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} 
else 
{
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;

63 hữu ích 4 bình luận chia sẻ

answer

36

Đối với Apache:

'http'.[empty[$_SERVER['HTTPS']]?'':'s'].'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']


Bạn cũng có thể sử dụng HTTP_HOSTthay vì SERVER_NAMEnhư Herman nhận xét. Xem câu hỏi liên quan này để thảo luận đầy đủ. Nói tóm lại, bạn có thể ổn với việc sử dụng một trong hai. Đây là phiên bản 'máy chủ':

'http'.[empty[$_SERVER['HTTPS']]?'':'s'].'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']

Đối với người hoang tưởng / Tại sao nó có vấn đề

Thông thường, tôi đặt ServerNametrong VirtualHostvì tôi muốn đóhình thức chính tắc của trang web. Các $_SERVER['HTTP_HOST']được thiết lập dựa trên các tiêu đề yêu cầu. Nếu máy chủ phản hồi bất kỳ / tất cả các tên miền tại địa chỉ IP đó, người dùng có thể giả mạo tiêu đề hoặc tệ hơn, ai đó có thể trỏ bản ghi DNS đến địa chỉ IP của bạn và sau đó máy chủ / trang web của bạn sẽ cung cấp trang web động liên kết được xây dựng trên một URL không chính xác. Nếu bạn sử dụng phương thức sau, bạn cũng nên định cấu hình vhosthoặc thiết lập .htaccessquy tắc để thực thi tên miền bạn muốn phân phát, đại loại như:

RewriteEngine On
RewriteCond %{HTTP_HOST} ![^stackoverflow.com*]$
RewriteRule [.*] https://stackoverflow.com/$1 [R=301,L]
#sometimes u may need to omit this slash ^ depending on your server

Mong rằng sẽ giúp. Điểm thực sự của câu trả lời này chỉ là cung cấp dòng mã đầu tiên cho những người đã kết thúc ở đây khi tìm kiếm cách để có được URL hoàn chỉnh với apache :]

36 hữu ích 1 bình luận chia sẻ

answer

11

$_SERVER['REQUEST_URI'] không hoạt động trên IIS, nhưng tôi đã tìm thấy điều này: //neosmart.net/blog/2006/100-apache-compliant-request_uri-for-iis-and-windows/ nghe có vẻ hứa hẹn.

11 hữu ích 0 bình luận chia sẻ

answer

9

Sử dụng lớp này để có được URL hoạt động.

class VirtualDirectory
{
    var $protocol;
    var $site;
    var $thisfile;
    var $real_directories;
    var $num_of_real_directories;
    var $virtual_directories = array[];
    var $num_of_virtual_directories = array[];
    var $baseURL;
    var $thisURL;

    function VirtualDirectory[]
    {
        $this->protocol = $_SERVER['HTTPS'] == 'on' ? 'https' : 'http';
        $this->site = $this->protocol . '://' . $_SERVER['HTTP_HOST'];
        $this->thisfile = basename[$_SERVER['SCRIPT_FILENAME']];
        $this->real_directories = $this->cleanUp[explode["/", str_replace[$this->thisfile, "", $_SERVER['PHP_SELF']]]];
        $this->num_of_real_directories = count[$this->real_directories];
        $this->virtual_directories = array_diff[$this->cleanUp[explode["/", str_replace[$this->thisfile, "", $_SERVER['REQUEST_URI']]]],$this->real_directories];
        $this->num_of_virtual_directories = count[$this->virtual_directories];
        $this->baseURL = $this->site . "/" . implode["/", $this->real_directories] . "/";
        $this->thisURL = $this->baseURL . implode["/", $this->virtual_directories] . "/";
    }

    function cleanUp[$array]
    {
        $cleaned_array = array[];
        foreach[$array as $key => $value]
        {
            $qpos = strpos[$value, "?"];
            if[$qpos !== false]
            {
                break;
            }
            if[$key != "" && $value != ""]
            {
                $cleaned_array[] = $value;
            }
        }
        return $cleaned_array;
    }
}

$virdir = new VirtualDirectory[];
echo $virdir->thisURL;

9 hữu ích 1 bình luận chia sẻ

answer

7

Thêm vào:

function my_url[]{
    $url = [!empty[$_SERVER['HTTPS']]] ?
               "//".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] :
               "//".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    echo $url;
}

Sau đó chỉ cần gọi my_urlhàm.

7 hữu ích 0 bình luận chia sẻ

answer

5

Tôi sử dụng chức năng sau để có được URL đầy đủ hiện tại. Điều này sẽ hoạt động trên IIS và Apache.

function get_current_url[] {

  $protocol = 'http';
  if [$_SERVER['SERVER_PORT'] == 443 || [!empty[$_SERVER['HTTPS']] && $_SERVER['HTTPS'] == 'on']] {
    $protocol .= 's';
    $protocol_port = $_SERVER['SERVER_PORT'];
  } else {
    $protocol_port = 80;
  }

  $host = $_SERVER['HTTP_HOST'];
  $port = $_SERVER['SERVER_PORT'];
  $request = $_SERVER['PHP_SELF'];
  $query = isset[$_SERVER['argv']] ? substr[$_SERVER['argv'][0], strpos[$_SERVER['argv'][0], ';'] + 1] : '';

  $toret = $protocol . '://' . $host . [$port == $protocol_port ? '' : ':' . $port] . $request . [empty[$query] ? '' : '?' . $query];

  return $toret;
}

5 hữu ích 2 bình luận chia sẻ

answer

4

REQUEST_URI được thiết lập bởi Apache, vì vậy bạn sẽ không nhận được nó bằng IIS. Hãy thử thực hiện var_dump hoặc print_r trên $ _SERVER và xem những giá trị nào tồn tại ở đó mà bạn có thể sử dụng.

4 hữu ích 0 bình luận chia sẻ

answer

3

Phần tiêu đề của URL nằm sau index.phptệp của bạn , đây là cách phổ biến để cung cấp các URL thân thiện mà không cần sử dụng mod_rewrite. Do đó, tiêu đề thực sự là một phần của chuỗi truy vấn, vì vậy bạn sẽ có thể lấy nó bằng cách sử dụng $ _SERVER ['QUERY_STRING']

3 hữu ích 1 bình luận chia sẻ

answer

2

Sử dụng dòng sau trên đầu trang PHP nơi bạn đang sử dụng $_SERVER['REQUEST_URI']. Điều này sẽ giải quyết vấn đề của bạn.

$_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'] . '?' . $_SERVER['argv'][0];

2 hữu ích 0 bình luận chia sẻ

answer

1

Ôi, niềm vui của một đoạn trích!

if [!function_exists['base_url']] {
    function base_url[$atRoot=FALSE, $atCore=FALSE, $parse=FALSE]{
        if [isset[$_SERVER['HTTP_HOST']]] {
            $http = isset[$_SERVER['HTTPS']] && strtolower[$_SERVER['HTTPS']] !== 'off' ? 'https' : 'http';
            $hostname = $_SERVER['HTTP_HOST'];
            $dir =  str_replace[basename[$_SERVER['SCRIPT_NAME']], '', $_SERVER['SCRIPT_NAME']];

            $core = preg_split['@/@', str_replace[$_SERVER['DOCUMENT_ROOT'], '', realpath[dirname[__FILE__]]], NULL, PREG_SPLIT_NO_EMPTY];
            $core = $core[0];

            $tmplt = $atRoot ? [$atCore ? "%s://%s/%s/" : "%s://%s/"] : [$atCore ? "%s://%s/%s/" : "%s://%s%s"];
            $end = $atRoot ? [$atCore ? $core : $hostname] : [$atCore ? $core : $dir];
            $base_url = sprintf[ $tmplt, $http, $hostname, $end ];
        }
        else $base_url = '//localhost/';

        if [$parse] {
            $base_url = parse_url[$base_url];
            if [isset[$base_url['path']]] if [$base_url['path'] == '/'] $base_url['path'] = '';
        }

        return $base_url;
    }
}

Nó có lợi nhuận đẹp như:

// A URL like //stackoverflow.com/questions/189113/how-do-i-get-current-page-full-url-in-php-on-a-windows-iis-server:

echo base_url[];    // Will produce something like: //stackoverflow.com/questions/189113/
echo base_url[TRUE];    // Will produce something like: //stackoverflow.com/
echo base_url[TRUE, TRUE]; || echo base_url[NULL, TRUE]; //Will produce something like: //stackoverflow.com/questions/

// And finally:
echo base_url[NULL, NULL, TRUE];
// Will produce something like:
//      array[3] {
//          ["scheme"]=>
//          string[4] "http"
//          ["host"]=>
//          string[12] "stackoverflow.com"
//          ["path"]=>
//          string[35] "/questions/189113/"
//      }

1 hữu ích 0 bình luận chia sẻ

answer

0

Mọi người quên http_build_url ?

http_build_url[$_SERVER['REQUEST_URI']];

Khi không có tham số nào được chuyển đến http_build_urlnó sẽ tự động giả sử URL hiện tại. Tôi cũng mong đợi REQUEST_URIđược bao gồm, mặc dù nó dường như được yêu cầu để bao gồm các tham số GET.

Ví dụ trên sẽ trả về URL đầy đủ.

0 hữu ích 4 bình luận chia sẻ

answer

0

Tôi đã sử dụng mã sau đây và tôi nhận được kết quả đúng ...

0 hữu ích 1 bình luận chia sẻ

answer

0

Trong máy chủ apache của tôi, điều này cung cấp cho tôi URL đầy đủ ở định dạng chính xác mà bạn đang tìm kiếm:

$_SERVER["SCRIPT_URI"]

0 hữu ích 0 bình luận chia sẻ

Chủ Đề