আন্ডারস্কোরের সাথে ক্যোসার্টিং প্রশ্ন চিহ্নটি প্রতিস্থাপন করার জন্য এনজিনেক্স পুনরায় লেখার নিয়ম


16

একটি সম্পূর্ণ ওয়েবসাইটকে স্থির HTML হিসাবে মিরর করার জন্য,

আমি URL গুলি রূপান্তর করতে চাই http://example.com/script.php?t=12করতে http://example.com/script.php_t=12

?ইউআরএল-এ নোটিশ রূপান্তরিত হচ্ছে _

এটি wgetপিএইচপি ফাইলের পরিবর্তে এনজিন্স বা অ্যাপাচিগুলি এই ফাইলগুলিকে ডিস্ক থেকে পরিবেশন করার জন্য কাঁচা এইচটিএমএল হিসাবে আমাদের প্রতিটি URL এর জন্য একটি ফাইল - সংরক্ষণ করেছে এবং সংরক্ষণ করেছে।

এনগিনেক্স ইউআরএল পুনর্লিখনের মাধ্যমে কি এটি করা সম্ভব?


এটি অবশ্যই সম্ভব, তবে সত্যই অদ্ভুত। আপনি এটি কি জন্য চান?
অ্যালেক্সি টেন

2
এই পদ্ধতির সাথে একটি সমস্যা হ'ল কোনও ইউআরএলতে একাধিক জিইটি প্যারামিটারগুলি যে কোনও ক্রমে থাকতে পারে এবং আপনি যখন এই রূপান্তরটি করেন, আপনি ইউআরএলটির শব্দার্থবিজ্ঞান পরিবর্তন করবেন।
তেরো কিলকেনেন

এটি স্ট্যাটিক এইচটিএমএলে একটি পুরানো ফোরাম আর্কাইভ করার জন্য, তবে হ্যাঁ এই কাজটি করার http://example.com/script.php?a=1&t=3জন্য কিছু সুপার অভিনব পুনর্লিখনের ক্রিয়া প্রয়োজন হবে
স্যাম সাফ্রন

1
@ ক্যোরিস্ট্রিং ইউআরএলগুলি অনুশীলনে সর্বদা একই ক্রমে থাকে। সুতরাং এটি একটি নন ইস্যু।
জেফ অ্যাটউড

1
@chx এটা একটি পুরানো ফোরাম সংরক্ষণ জন্য, তাই যুক্তি ছাড়া অন্য হতে পারে tমত f, uইত্যাদি
Arpit জালান

উত্তর:


15

ট্রাই_ফাইল ব্যবহার করে এই কাজটি পেয়েছি:

location / {
    try_files "${uri}_${args}" 404.html;
}

এটি আপনার ""? "এর পরিবর্তে" _ "দিয়ে সরবরাহিত প্যাটার্ন অনুসারে ডিস্কে একটি ফাইল সন্ধান করার চেষ্টা করবে।

পরবর্তী কনফিগারেশন নির্ভর করে আপনি কীভাবে চিত্র বা স্টাইলশিটের স্থিতিশীল ফাইলগুলি সংরক্ষণ করেছিলেন saved আপনি কোয়েরি স্ট্রিং ফর্ম ডিস্ক ছাড়াই এগুলি পড়ার চেষ্টা করে ফ্যালব্যাক যুক্ত করতে পারেন:

location / {
    try_files "${uri}_${args}" $uri 404.html;
}

1
খুব আকর্ষণীয় পদ্ধতির, যদিও এটি সমস্ত সম্ভাব্য URL গুলিতে একটি সম্ভাব্য ডিস্ক পড়ার এবং "ফাইল খুঁজে পাওয়া যায় না"?
জেফ

ট্রাই_ফাইলগুলি থেকে : "নির্দিষ্ট ক্রমে ফাইলগুলির অস্তিত্ব পরীক্ষা করে এবং অনুরোধ প্রক্রিয়াকরণের জন্য প্রথম পাওয়া ফাইলটি ব্যবহার করে"। সুতরাং এটি আপনার প্রশ্নের URL গুলির জন্য কোনও অতিরিক্ত ডিস্ক পড়ার কারণ হবে না।
ম্যাথিয়াস বায়ার

1
ঠিক আছে, আমরা যদি এটি রাখি তবে আমরা কাজ location ~ \.php$পেতে পারি try_filesতবে এটি কার্যকর হয় নাlocation /
জেফ আতউড

কোঁকড়ানো ধনুর্বন্ধনী ব্যবহারের জন্য উদাহরণস্বরূপ +1 :)
ড্যানিলা ভারশিনিন

4

লাইন বরাবর কিছু:

location ~ \.php$ {
  # only rewrite URL's with args
  if ($args != '') {
    rewrite .* "${uri}_${args}?" last;
  }
}

আপনি ?আমার উত্তর ব্যবহার করা ছেড়ে ।
chx

আপনি সঠিকভাবে?? আপনার উত্তর হিসাবে - সত্যিকারের সার্ভারে এটি পরীক্ষা করতে আমার কিছুটা সময় লেগেছে, সুতরাং আমি আমার পোস্ট না করা অবধি আপনার দেখিনি। এবং আপনার অনাকাঙ্ক্ষিত হতে পারে "_" দিয়ে বৈকল্পিকের জন্য যুক্তি ছাড়াই সমস্ত URL টি পুনরায় লিখবে।
সর্বোচ্চ গ্যাশকভ

চেষ্টা_ফায়ালের সাহায্যে ম্যাথিয়াসের সমাধান এর চেয়ে আরও ভাল।
সর্বোচ্চ গ্যাশকভ

আমরা যদি তা না করেই করতে পারি, যখন আমরা .*প্রথম পুনর্লিখনের প্যারামে আরও কঠোর ধারা উল্লেখ করি । এটি অত্যন্ত সহায়ক!
জেফ

@ জেফএটউড আমি মনে করি না যে এটি সম্ভব — nginx পুনর্লিখন (পাশাপাশি অবস্থান) নিদর্শনগুলি কেবল ক্যোয়ারী স্ট্রিংয়ের আগে কোনও URL এর অংশে প্রয়োগ করা উচিত।
ম্যাক্স গ্যাশকভ

1

ভ্যানিলা এনজিনেক্সের সাহায্যে আপনি এটি করতে সক্ষম হবেন বলে আমি মনে করি না তবে আপনি যদি এনজিনেক্সের জন্য লুয়া মডিউল ইনস্টল করতে ইচ্ছুক হন ( http://wiki.nginx.org/HttpLuaModule ) আপনি এটি করতে পারেন।

server {
    server_name so.dev;
    listen 80;

    location / {

        root /tmp;

        rewrite_by_lua '
            local uri = ngx.var.uri
            local params = ngx.req.get_uri_args(0)

            for key, value in pairs(params) do
                uri = string.format("%s_%s=%s", uri, key, value)
            end

            ngx.req.set_uri(uri)
            ngx.req.set_uri_args({})
        ';

    }
}

এটি স্থানীয়ভাবে পরীক্ষিত হয়েছে এবং আপনি যা খুঁজছেন তা মনে হচ্ছে। আপনি যদি অন্য প্যারামগুলিকে অ্যাম্পারস্যান্ডগুলি দ্বারা পৃথক রাখতে চান তবে পুনর্লিখন_বি_লুয়া ব্লকটি পরিবর্তন করুন

local uri = ngx.var.uri
local param_string = ""
local params = ngx.req.get_uri_args(0)
local separator = ""

for key, value in pairs(params) do
    param_string = param_string .. separator .. key .. "=" .. value
    separator = "&"
end

ngx.req.set_uri(uri .. "_" .. param_string)
ngx.req.set_uri_args({})

1

এটি nginx / 1.6.2 এ কাজ করে।

rewrite ^/.*\.php$ "${uri}_${args}";

তবে ব্যক্তিগতভাবে আমি কোনও try_filesমূল ইউআরআই-এর ফ্যালব্যাক সহ সমাধানটি ব্যবহার করব যদি কোনও থাকে

try_files $uri "${uri}_${args}";

উদাহরণস্বরূপ, আপনার যদি script.phpডিস্কে থাকে তবে এটি প্রথমে চেষ্টা করে দেখতে হবে এবং তারপরে যদি কিছুই না থাকে তবে এটি সন্ধান করতে হবে script.php_t=12try_filesnginx এর সাম্প্রতিক পর্যায়ে যথেষ্ট সংস্করণ দরকার।

এবং যদি এটি পর্যাপ্ত না হয় তবে আপনি এটির ভিতরে এটি করতে পারেন if:

return 301 "${uri}_${args}";

আমি এটি পছন্দ করি, কিন্তু আমরা try_files বিট আসলে কাজ করতে, যেহেতু লেখা পেতে পারে না করেন কাজ। (ভাল, আপনি যদি ?নিজের পুনরায় লেখার শেষে সেখানে যুক্ত করেন যাতে ক্যোয়ারী প্যারামগুলি এতে যুক্ত হয় না ..)
জেফ আতউড

@ জেফএটউড সেখানে try_filesথামাতে চলেছে $uriযদি কোনও লোকেশন ব্লকের সাথে মিলে যায়, বা এর জন্য একটি ফাইল ( আর্কস না পেয়ে অনুরোধ) - তা কি কেস?
AD7six

?স্ট্যাটিক ফাইলগুলিতে @ জেফএটউডের কোনও দৃশ্যমান প্রভাব নেই, আপনি কেবল আপনার অ্যাক্সেস লগগুলিতে একটি অতিরিক্ত ক্যোয়ারী দেখতে পাবেন; যদি আপনি এটি সম্পর্কে যত্নশীল হন তবে অবশ্যই একটি প্রশ্ন চিহ্ন যুক্ত করুন
সান্মাই

0

উইকি বলেছেন

আপনি যদি একটি নির্দিষ্ট করে? পুনর্লিখনের শেষে এনজিনেক্স মূল $ আরোগুলি (আর্গুমেন্ট) বাদ দেবে।

সুতরাং rewrite ^ ${uri}_$args? last;কাজ করা উচিত।


এনগিনেক্স সেই নিয়ম সেটটি নিয়ে পুনরায় আরম্ভ করতে ব্যর্থ হয়েছে -rewrite ^ $uri_$args? last;
জেফ

সংশোধন করা হয়েছে। Ble-বিলিডস-ওভার-দ্য ভেরিয়েবলগুলি পিএইচপি এর মতো অনুভূত হয় যা আমি জানি আপনি কেবল ভালোবাসেন।
chx

এমনকি সংশোধিত সংস্করণ সহ, এনগিনেক্স পুনরায় আরম্ভ করতে ব্যর্থ হয়
জেফ

0

উপরে প্রস্তাবিত উত্তরগুলি কাজ করা উচিত। তবে আপনি দেখতে পাবেন যে আপনার URL টি কতটা সংবেদনশীল হয়ে ওঠে। যেহেতু এনজিনেক্স সার্ভারে প্রথমে ফাইলটির নাম উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখার চেষ্টা করে, কোনও অতিরিক্ত পরামিতি এটিকে ফেলে দেবে।

http://example.com/script.php?t=12 // works 
http://example.com/script.php?t=12&_utm=twitter // not work

আমার পরামর্শ হ'ল ইউআরএলটি যেমন হয় তেমনি পিএইচপি সহ ফাইলটিতে রাইটিং করা। আপনি tপ্যারামিটার অ্যাক্সেস আছে ।

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