Nginx অবস্থানের ব্লকগুলি কি কোনও URL কোয়েরি স্ট্রিংয়ের সাথে মেলে?


23

এনগিনেক্স locationব্লকগুলি কি কোনও ইউআরএল কোয়েরি স্ট্রিংয়ের সাথে মেলে?

উদাহরণস্বরূপ, কোন অবস্থান ব্লক এইচটিটিপি GETঅনুরোধের সাথে মেলে

GET /git/sample-repository/info/refs?service=git-receive-pack HTTP/1.1

আমি "অবস্থান / গিট / নমুনা-সংগ্রহস্থল / তথ্য / রেফার্স? পরিষেবা = গিট-রিসিভ-প্যাক" অনুভব করব যেহেতু এনজিএনএক্স কেবল স্ট্রিং তুলনা করে।
জোসেফস্ক্রিপ্ট

পুরো ইউআরএল এর স্ট্রিং তুলনা বা প্রশ্ন চিহ্ন ( ?) এর ঠিক আগের অংশ ?
ডেরেক মহর



1
এই সমস্যাটি আমি নিজেই হোঁচট খেয়েছি বলে শেষের কয়েকটি স্পষ্টতা: nginx.org/en/docs/http/request_processing.html পরিষ্কারভাবে বলেছে: "নোট করুন যে সমস্ত ধরণের অবস্থানগুলি
থমাস আরবান

উত্তর:


37

Nginx অবস্থানের ব্লকগুলি কি কোনও URL কোয়েরি স্ট্রিংয়ের সাথে মেলে?

সংক্ষিপ্ত উত্তর : না

দীর্ঘ উত্তর : যদি আমাদের কাছে কেবলমাত্র এইরকম লোকেশন ব্লক থাকে a

এখানে 3 অবস্থানের ব্লকগুলির জন্য একটি নমুনা বিশিষ্ট যা নির্দিষ্ট ক্যোয়ারী স্ট্রিংগুলির সাথে মেলে প্রয়োজন:

server {
  #... common definitions such as server, root

  location / {
    error_page 418 = @queryone;
    error_page 419 = @querytwo;
    error_page 420 = @querythree;

    if ( $query_string = "service=git-receive-pack" ) { return 418; }
    if ( $args ~ "service=git-upload-pack" ) { return 419; }
    if ( $arg_somerandomfield = "somerandomvaluetomatch" ) { return 420; }

    # do the remaining stuff
    # ex: try_files $uri =404;

  }

  location @queryone {
    # do stuff when queryone matches
  }

  location @querytwo {
    # do stuff when querytwo matches
  }

  location @querythree {
    # do stuff when querythree matches
  }
}

আপনি $ ক্যোয়ারী_স্ট্রিং, $ আরগস বা $ আরগ_ফিল্ডের নাম ব্যবহার করতে পারেন। সবাই কাজ করবে। আপনি অফিসিয়াল ডক্সে ত্রুটি_পৃষ্ঠা সম্পর্কে আরও জানতে পারেন ।

সতর্কতা: দয়া করে স্ট্যান্ডার্ড এইচটিটিপি কোড ব্যবহার করবেন না তা নিশ্চিত হন ।


1
আকর্ষণীয় পদ্ধতির! আমি কি $args ~ "service=git-send-pack"পরিবর্তে সুপারিশ করতে পারি $args = "service=git-send-pack"? এই ফর্মটি একাধিক ক্যোয়ারী প্যারামিটারগুলি সমন্বিত করে।
ডেরেক মাহর

1
stackoverflow.com/a/40313590/107158 কোয়েরি স্ট্রিং আর্গুমেন্টগুলি পরিচালনা করতে আমি যে পদ্ধতির অনুসরণ করেছি তা চিত্রিত করে। আপনার উত্তর ভালো লেগেছে, খনি ব্যবহার ifএবং $arg_fieldname, কিন্তু ব্যবহারের rewriteপরিবর্তে error_pageএবং location @name। মনে রাখবেন যে সেই উদাহরণে, প্রতিস্থাপনের পরামিতিগুলিতে ব্যবহারের @nameজন্য আমার প্রচেষ্টা ব্যর্থ হয়েছিল। rewrite
ডেরেক মাহর 21

1
যাইহোক, এটি হওয়া উচিত $args ~এবং $arg_somerandomfield =
ডেরেক মহর

1
কেউ mapএই উদ্দেশ্যে nginx বৈশিষ্ট্যটিও ব্যবহার করতে পারেন , এটি দ্রুত।
তেরো কিলকেনেন

1
@ পোথিকালিমুথু, এটি পরিষ্কার করার জন্য ধন্যবাদ thanks এর মধ্যে আমি যা করেছি তা হ'ল queryপ্যারামিটারটি এর feedback/{auth_key}পরিবর্তে এর মতো একটি url পাথ দ্বারা প্রতিস্থাপন করা /feedback?auth_key=abc। এইভাবে আমার ব্যবহারের দরকার নেই if, আমি ব্যবহার করে অবস্থানের প্যাটার্নটি সংজ্ঞায়িত করতে পারি regexএবং এটিই।
ডাব্লুএম

4

আমি জানি এই প্রশ্নটি এক বছরেরও বেশি পুরনো, তবে আমি গত কয়েক দিন একই ধরণের সমস্যার কারণে আমার মস্তিষ্ককে ধ্বংস করে দিয়েছি। আমি সরকারী এবং প্রাইভেট রেপোর জন্য ধাক্কা এবং টান সহ বিভিন্ন প্রমাণীকরণ এবং পরিচালনা করার নিয়ম চেয়েছিলাম। অবশেষে এটিই আমি এনেছি, তাই আমি অনুভব করেছি যে আমি ভাগ করে নেব। আমি জানি ifএকটি কৌতূহল নির্দেশ, তবে এটি আমার পক্ষে ঠিক কাজ করে বলে মনে হচ্ছে:

# pattern for all repos, public or private, followed by username and reponame
location ~ ^(?:\/(private))?\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?$ {

    # if this is a pull request
    if ( $arg_service = "git-upload-pack" ) {

        # rewrite url with a prefix
        rewrite ^ /upload$uri;

    }

    # if this is a push request
    if ( $arg_service = "git-receive-pack" ) {

        # rewrite url with a prefix
        rewrite ^ /receive$uri;

    }

}

# for pulling public repos
location ~ ^\/upload(\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?)$ {

    # auth_basic "git";
    # ^ if you want

    # ...
    # fastcgi_pass unix:/var/run/fcgiwrap.socket;
    # ...

}

# for pushing public repos
location ~ ^\/receive(\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?)$ {

    # auth_basic "git";
    # ^ if you want

    # ...
    # fastcgi_pass unix:/var/run/fcgiwrap.socket;
    # ...

}

# for pulling private repos
location ~ ^\/upload\/private(\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?)$ {

    # auth_basic "git";
    # ^ if you want

    # ...
    # fastcgi_pass unix:/var/run/fcgiwrap.socket;
    # ...

}

# for pushing private repos
location ~ ^\/receive\/private(\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?)$ {

    # auth_basic "git";
    # ^ if you want

    # ...
    # fastcgi_pass unix:/var/run/fcgiwrap.socket;
    # ...

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.