মোড_উইরাইটের লুকানো বৈশিষ্ট্য


119

এর mod_rewriteনির্দিষ্ট কিছু দিকগুলি কীভাবে কাজ করে তা নিয়ে কিছুটা বিভ্রান্তি নিয়ে ইদানীং চারপাশে ভাসমান একটি সুসংখ্যক থ্রেড রয়েছে বলে মনে হয় । ফলস্বরূপ আমি সাধারণ কার্যকারিতা সম্পর্কে কয়েকটি নোট এবং সম্ভবত কিছু বিরক্তিকর সূক্ষ্ম সংকলন করেছি।

অন্যান্য কোন বৈশিষ্ট্য / সাধারণ সমস্যাগুলি আপনি ব্যবহার করে চালিয়ে গেছেন mod_rewrite?


উত্তর:


203

মোড_উরাইট বিধি কোথায় রাখবেন

mod_rewriteনিয়মগুলি httpd.confফাইলের মধ্যে বা ফাইলের মধ্যে স্থাপন করা যেতে পারে .htaccess। আপনার যদি অ্যাক্সেস থাকে তবে httpd.confনিয়মগুলি এখানে রাখলে একটি পারফরম্যান্স সুবিধা দেওয়া হবে (নিয়মগুলি একবারে প্রক্রিয়া করা হয়, প্রতিটি বার .htaccessফাইলটি কল করার পরে)।

মোড_্রুরাইটের অনুরোধগুলি লগ করা হচ্ছে

httpd.confফাইলের মধ্যে থেকে লগিং সক্ষম করা যেতে পারে (সহ <Virtual Host>):

# logs can't be enabled from .htaccess
# loglevel > 2 is really spammy!
RewriteLog /path/to/rewrite.log
RewriteLogLevel 2

সাধারণ ব্যবহারের ক্ষেত্রে

  1. সমস্ত অনুরোধকে একক পয়েন্টে আনতে:

    RewriteEngine on
    # ignore existing files
    RewriteCond %{REQUEST_FILENAME} !-f   
    # ignore existing directories
    RewriteCond %{REQUEST_FILENAME} !-d   
    # map requests to index.php and append as a query string
    RewriteRule ^(.*)$ index.php?query=$1 
    

    অ্যাপাচি ২.২.১6 থেকে আপনি এটিও ব্যবহার করতে পারেন FallbackResource

  2. 301/302 পুনঃনির্দেশগুলি পরিচালনা করা:

    RewriteEngine on
    # 302 Temporary Redirect (302 is the default, but can be specified for clarity)
    RewriteRule ^oldpage\.html$ /newpage.html [R=302]  
    # 301 Permanent Redirect
    RewriteRule ^oldpage2\.html$ /newpage.html [R=301] 
    

    দ্রষ্টব্য : বাহ্যিক পুনঃনির্দেশগুলি সুস্পষ্টভাবে 302 পুনঃনির্দেশগুলি হয়:

    # this rule:
    RewriteRule ^somepage\.html$ http://google.com
    # is equivalent to:
    RewriteRule ^somepage\.html$ http://google.com [R]
    # and:
    RewriteRule ^somepage\.html$ http://google.com [R=302]
    
  3. এসএসএলকে বাধ্য করা হচ্ছে

    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://example.com/$1 [R,L]
    
  4. সাধারণ পতাকা:

    • [R]বা [redirect]- একটি পুনর্নির্দেশকে বাধ্য করুন (302 অস্থায়ী পুনঃনির্দেশের ডিফল্ট)
    • [R=301]বা [redirect=301]- একটি 301 স্থায়ী পুনঃনির্দেশ জোর
    • [L]বা [last]- পুনর্লিখন প্রক্রিয়া বন্ধ করুন (সাধারণ ক্ষতিগুলির নীচে নোট দেখুন)
    • [NC]বা [nocase]- নির্দিষ্ট করুন যে মিলটি ক্ষেত্রে সংবেদনশীল হওয়া উচিত


    পতাকাগুলির দীর্ঘ-রূপ ব্যবহার করা প্রায়শই বেশি পঠনযোগ্য এবং আপনার কোডটি পরে পড়তে আসা অন্যদের সহায়তা করবে।

    আপনি কমা দিয়ে একাধিক পতাকা পৃথক করতে পারেন:

    RewriteRule ^olddir(.*)$ /newdir$1 [L,NC]
    

সাধারণ ক্ষতি

  1. মিশ্রণ mod_aliasশৈলীর সাথে পুনঃনির্দেশmod_rewrite

    # Bad
    Redirect 302 /somepage.html http://example.com/otherpage.html
    RewriteEngine on
    RewriteRule ^(.*)$ index.php?query=$1
    
    # Good (use mod_rewrite for both)
    RewriteEngine on
    # 302 redirect and stop processing
    RewriteRule ^somepage.html$ /otherpage.html [R=302,L] 
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # handle other redirects
    RewriteRule ^(.*)$ index.php?query=$1                 
    

    নোট : আপনি মিশ্রিত করা যাবে mod_aliasসঙ্গে mod_rewrite, কিন্তু এটা শুধুমাত্র উপরের মতো মৌলিক পুনঃনির্দেশ হ্যান্ডলিং চেয়ে বেশি পরিশ্রম জড়িত।

  2. প্রবন্ধ সিনট্যাক্সকে প্রভাবিত করে

    .htaccessফাইলগুলির মধ্যে , একটি শীর্ষস্থানীয় স্ল্যাশ পুনর্লিখনের নিয়মে ব্যবহৃত হয় না:

    # given: GET /directory/file.html
    
    # .htaccess
    # result: /newdirectory/file.html
    RewriteRule ^directory(.*)$ /newdirectory$1
    
    # .htaccess
    # result: no match!
    RewriteRule ^/directory(.*)$ /newdirectory$1
    
    # httpd.conf
    # result: /newdirectory/file.html
    RewriteRule ^/directory(.*)$ /newdirectory$1
    
    # Putting a "?" after the slash will allow it to work in both contexts:
    RewriteRule ^/?directory(.*)$ /newdirectory$1
    
  3. [এল] শেষ নেই! (কখনও কখনও)

    [L]পতাকা কোনও লেখা নিয়ম প্রক্রিয়াকরণের স্টপ নিয়ম সেটকে যে পাস জন্য । তবে, যদি সেই পাসটিতে ইউআরএল সংশোধন করা হয় এবং আপনি .htaccessপ্রসঙ্গে বা <Directory>বিভাগে থাকেন তবে আপনার পরিবর্তিত অনুরোধটি আবার ইউআরএল পার্সিং ইঞ্জিনের মাধ্যমে ফেরত দেওয়া হবে। এবং পরবর্তী পাসে, এটি এবার অন্য একটি নিয়মের সাথে মেলে। আপনি যদি এটি বুঝতে না পারেন তবে এটি প্রায়শই মনে হয় আপনার [L]পতাকাটির কোনও প্রভাব নেই।

    # processing does not stop here
    RewriteRule ^dirA$ /dirB [L] 
    # /dirC will be the final result
    RewriteRule ^dirB$ /dirC     
    

    আমাদের পুনর্লিখনের লগটি দেখায় যে বিধিগুলি দু'বার পরিচালিত হয় এবং ইউআরএল দু'বার আপডেট হয়:

    rewrite 'dirA' -> '/dirB'
    internal redirect with /dirB [INTERNAL REDIRECT]
    rewrite 'dirB' -> '/dirC'
    

    এর সর্বোত্তম উপায় হ'ল [END]পতাকাটির পরিবর্তে পতাকাটি ব্যবহার করা ( অ্যাপাচি ডক্স দেখুন ) [L], যদি আপনি সত্যিকার অর্থে নিয়মের সমস্ত প্রক্রিয়া বন্ধ করতে চান (এবং পরবর্তী পাসগুলি)। তবে, [END]পতাকাটি কেবল অ্যাপাচি v2.3.9 + এর জন্য উপলভ্য , সুতরাং আপনার যদি ভি 2.2 বা তার চেয়ে কম থাকে তবে আপনি কেবল [L]পতাকাটিতে আটকে আছেন ।

    পূর্ববর্তী সংস্করণগুলির জন্য, RewriteCondইউআরএল পার্সিং ইঞ্জিনের পরবর্তী পাসগুলিতে নিয়মের সাথে মিল রাখা রোধ করতে আপনাকে বিবৃতিগুলির উপর নির্ভর করতে হবে ।

    # Only process the following RewriteRule if on the first pass
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ...
    

    অথবা আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার RewritRule এর কোনও প্রসঙ্গে রয়েছে (অর্থাত্ httpd.conf) যা আপনার অনুরোধটিকে পুনরায় বিশ্লেষণের কারণ করবে না।


10
ডুড, মোড পুনরায় লেখার জন্য ইন্টারনেটে সম্পূর্ণ সেরা নিবন্ধ। আমি সেই জিনিসটিকে ঘৃণা করি। আমি মোড_উরাইটকে কতটা ঘৃণা করি তার কারণে আমি লাইটটিপিডি এক ধর্মাবলম্বী।
কেন্ট ফ্রেড্রিক

3
এটি এখন পর্যন্ত মোড_উইরাইট-এ আমি খুঁজে পেয়েছি সবচেয়ে দরকারী গাইড। কেবল রাইরাইটলগ সম্পর্কে সন্ধান করা এতগুলি সমস্যার সমাধান করতে সহায়তা করেছিল যে আমাকে ট্র্যাক করতে কয়েক দিন সময় নিচ্ছিল তা কয়েক মিনিটের মধ্যে পরিণত হয়েছিল। (আমি বোঝাতে চাইছি বিধিগুলি রচিত হয়েছিল তবে তারা কেন কাজ করছে না তা বুঝতে পারি না)
জো চিন

1 বছরের পুরানো পোস্ট, তবে এসও-তে আমি খুঁজে পেয়েছি এমন আরও দরকারী জিনিসগুলির একটি - আমার জন্য।
এরিক

3
[L]পতাকা মানে একটি বিধি গত বর্তমান প্রক্রিয়াকরণে, এই rewriting বন্ধ হবে না কারণ তারা অভ্যন্তরীণ পুনঃনির্দেশ, তাই আপনার dirBক্ষেত্রে প্রযোজ্য dirCপরবর্তী htaccess প্রক্রিয়াকরণে। একা RewriteRule ^(.*)$ index.php?query=$1অভ্যন্তরীণ পুনঃনির্দেশগুলির অসীম লুপ হবে (বাস্তবে এটি 10 ​​টি পুনরাবৃত্তির পরে সমাপ্ত হবে)। -1 কারণ আপনি পরামর্শ দিচ্ছেন যে [এল] শেষ নয় । এটি পুনরায় লেখার প্রক্রিয়াটি শেষ করছে না, তবে এটি শেষ
কেবিইকে

3
আমি বিশ্বাস করি RewriteCond %{HTTPS} offএইচটিটিপিএস সংযোগের জন্য চেক করার পছন্দের উপায় (এইচটিটিপিএসে নন-এসএসএল ট্র্যাফিক জোর করার উদাহরণে)
ম্যাডব্রেকস

22

আপনার যদি .htaccess থেকে অভ্যন্তরীণ পুনর্নির্দেশ / পুনর্লিখনগুলি পুনরায় লেখার প্রয়োজন হয় তবে একবার দেখুন

RewriteCond %{ENV:REDIRECT_STATUS} ^$

শর্ত, এখানে আলোচনা হিসাবে ।


ধন্যবাদ, এটাই আমার সমস্যা ঠিক করেছে!
ম্যাথু

আমার জন্যও ধন্যবাদ, জীবন রক্ষাকারী!
বেঞ্জামিন

এটি আসলেই জীবন রক্ষাকারী! জনগণকে সে সম্পর্কে আরও সচেতন হওয়া উচিত। আসলে, আমি যে প্রশ্ন এই সুপারিশ যাচ্ছি সম্পর্কে .*সঙ্গে [L]আগে আমি এখানে পেয়েছিলাম পতাকা আমি পড়তে।
কিওয়ার্টি

আমি এই বেশ কয়েকটি পরিবর্তন দেখেছি 200, !=200, ^., ^$। স্পষ্টত পরিবর্তনশীল 200একটি পুনর্নির্দেশের জন্য সেট হয়ে যায় , তবে অন্যান্য পৃষ্ঠাগুলিও (ত্রুটি এবং স্টাফ) এটিকে কিছু মান হিসাবে সেট করে। এখন তার মানে আপনি হয় পরীক্ষা যদি এটা is empty, is not empty, is 200বা is not 200, আপনি কি প্রয়োজন উপর নির্ভর করে।
কিওয়ারটি

18

রিরাইটবেসের সাথে চুক্তি:

আপনার প্রায় সবসময়ই রাইরাইটবেস সেট করা দরকার। যদি আপনি এটি না করেন তবে আপাচি অনুমান করে যে আপনার বেসটি আপনার ডিরেক্টরিতে দৈহিক ডিস্কের পথ path সুতরাং এটি দিয়ে শুরু করুন:

RewriteBase /

আহ। এটি সম্পূর্ণরূপে আমার যে সমস্যাটি ছিল তা ঠিক করেছিল। তার জন্য ধন্যবাদ!
টম সেভেজ

3
বলার কোনও উপায় RewriteBase ., বা এমন কিছু বোঝার জন্য যে এটির URL টি একই থাকবে, কেবলমাত্র আপনি যা নির্দিষ্ট করেছেন তা পরিবর্তন করবেন?
জে কে

আপনাকে ধন্যবাদ, এটি একটি অমূল্য তথ্য ছিল। :)
আতুরস্যামস

2
আপনি যদি কেবল নির্দেশের ক্ষেত্রে RewriteBaseআপেক্ষিক পথের বিকল্প ব্যবহার করছেন তবে আপনাকে সেট করতে হবে RewriteRule। আপেক্ষিক পাথ ব্যবহার না করা ভাল।
মিঃ হোয়েট

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

13

অন্যান্য ক্ষতি:

1- কখনও কখনও মাল্টিভিউগুলি অক্ষম করা ভাল ধারণা

Options -MultiViews

আমি সমস্ত মাল্টিভিউর ক্ষমতাগুলির পক্ষে ভালভাবে শ্লোক নই, তবে আমি জানি যে এটি সক্রিয় থাকাকালীন আমার মোড_উইরাইট বিধিগুলিকে গণ্ডগোল করে দেয় কারণ এর বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল এমন ফাইলের এক্সটেনশানটি চেষ্টা করা এবং অনুমান করা যা আমি মনে করি যে এটি আমি সন্ধান করছি ।

আমি ব্যাখ্যা করব: ধরা যাক আপনার ওয়েব dir, file1.php এবং file2.php এ 2 পিএইচপি ফাইল রয়েছে এবং আপনি এই শর্তাদি যুক্ত করুন এবং আপনার .htaccess এ নিয়ম করুন:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ file1.php/$1 

আপনি ধরে নিয়েছেন যে ফাইল বা ডিরেক্টরিতে মেলে না এমন সমস্ত url ফাইল1.php দ্বারা ধরা হবে। আশ্চর্য! এই নিয়মটি ইউআরএল http: // myhost / file2 / somepath এর জন্য সম্মানিত হচ্ছে না । পরিবর্তে আপনি file2.php ভিতরে নেওয়া হয়েছে।

যা চলছে তা হ'ল মাল্টিভিউজ স্বয়ংক্রিয়ভাবে অনুমান করেছিল যে আপনি যে ইউআরএলটি চেয়েছিলেন সেটি হ'ল http: //myhost/file2.php/somepath এবং খুশিতে আপনাকে সেখানে নিয়ে গিয়েছিল।

এখন, কী ঘটেছিল সে সম্পর্কে আপনার কোনও ধারণা নেই এবং আপনি সেই মুহুর্তে এমন সমস্ত কিছু নিয়ে প্রশ্ন করছেন যা আপনি ভেবেছিলেন যে আপনি মোড_রাইট্রাইট সম্পর্কে জানেন। তারপরে আপনি এই নতুন পরিস্থিতির পিছনে যুক্তিটি বোঝার চেষ্টা করার জন্য নিয়মাবলী নিয়ে খেলা শুরু করেন, তবে যত কম আপনি তা বোধগম্যতার পরীক্ষা করছেন।

ঠিক আছে, সংক্ষেপে আপনি যদি মোড_উইরাইটটি এমনভাবে কাজ করতে চান যা যুক্তিটির সান্নিধ্যের দিকে চলে যায় তবে মাল্টিভিউগুলি বন্ধ করা সঠিক দিকের একটি পদক্ষেপ।

2- ফলোসিম্লিংকগুলি সক্ষম করুন

Options +FollowSymLinks 

এইটি, আমি সত্যিকারের বিবরণ জানি না, তবে আমি এটি বহুবার উল্লেখ করেছি, তাই এটি করুন।


ধন্যবাদ :) আমি / লগ / ক্রিয়াকলাপ / লগ / টেক্সট / অ্যাক্টিভিটিতে রূপান্তরিত হওয়ার মতো অপ্রত্যাশিত বিস্ময়গুলি লক্ষ্য করেছি .. টিপটির জন্য ধন্যবাদ :) .. খুব খারাপ কম্পিউটার কখনও অপ্রত্যাশিত জিনিসগুলি ঘটনাক্রমে আপনার সমস্ত মহিলা সহকর্মীকে ফেসবুকে প্রলুব্ধ করার মতো ঘটায় না make :)
আতুরস্যামস

1
+FollowSymLinksmod_rewriteঅস্পষ্ট নিরাপত্তাজনিত কারণে ডকুমেন্টেশনে এটিকে আদৌ কাজ করা বাধ্যতামূলক বলে উল্লেখ করা হয়েছে ।
জোয়

এখানে দুটি বক্তব্য আমাকে চিন্তিত করেছে, অপরিসীমভাবে: 'আমি সমস্ত মাল্টিভিউ দক্ষতার পক্ষে ভালভাবে শ্লোক নই, তবে আমি জানি যে এটি সক্রিয় থাকাকালীন আমার মোড_উইগ্রাইট বিধিগুলিকে গণ্ডগোল করে দেয়' এবং এই একটি 'আমি সত্যিই এর বিবরণ জানি না , তবে আমি এটি বহুবার উল্লেখ করেছি, তাই এটি করুন। ' আমি আশা করি আপনার মতো লোকেরা যে বিষয়ে আপনি অনিশ্চিত তা সম্পর্কে এস ও তে উত্তর লিখবেন না।
TheCarver

1
@ পাপারাজ্জোকিড: আমি মনে করি আপনি একটি বিশ্বকোষের জন্য এত ভুল করছেন। এটি এমন একটি সম্প্রদায় যা তারা কাজ করছে সেই প্রযুক্তিটির বোঝার জন্য একত্রিত হয়। আপনার আগে এডাব্লু হোয়াইট এবং জোয়ের মতো নয়, আপনার মন্তব্যটি প্রায় মূল্যহীন। এমভি এবং এফএসএল অনেকগুলি অ্যাপাচের বিকল্পগুলির মধ্যে 2। আমার উত্তরটি বিশেষত মোড_আরডব্লিউয়ের সাথে কাজ করার সময় সমস্যাগুলি সম্পর্কে, একটি পৃথক মডিউল, যা কিছু বিকল্পের সাথে দ্বন্দ্ব করে এবং অন্যদের সাথে কাজ করে। আমি ব্যাখ্যা করেছি যে এমভি কীভাবে মোড_আরডকে প্রভাবিত করে এবং উল্লেখ করেছে যে + এফএসএল একটি জনপ্রিয় প্রস্তাবনা। জো নিশ্চিত করেছে যে এটি আসলে বাধ্যতামূলক। আপনি টেবিলে কি আনবেন?
মাইকেল একোকা

ধন্যবাদ। আমি কেবলমাত্র একটি উত্তরাধিকারের সাইটটি কাজ করার জন্য এবং পুনর্লিখনের নিয়মগুলি ডিবাগ করার চেষ্টা করার এক ঘন্টা সবচেয়ে ভাল সময় ব্যয় করেছি, কেবলমাত্র মাল্টভিউজগুলি এগুলি সমস্ত ওভাররাইড করে চলেছে তা সন্ধান করার জন্য।
অ্যান্ড্রু ম্যাককম 13

5

সমীকরণ নিম্নলিখিত উদাহরণ দিয়ে করা যেতে পারে:

RewriteCond %{REQUEST_URI} ^/(server0|server1).*$ [NC]
# %1 is the string that was found above
# %1<>%{HTTP_COOKIE} concatenates first macht with mod_rewrite variable -> "test0<>foo=bar;"
#RewriteCond search for a (.*) in the second part -> \1 is a reference to (.*)
# <> is used as an string separator/indicator, can be replaced by any other character
RewriteCond %1<>%{HTTP_COOKIE} !^(.*)<>.*stickysession=\1.*$ [NC]
RewriteRule ^(.*)$ https://notmatch.domain.com/ [R=301,L]

গতিশীল লোড ব্যালান্সিং:

আপনি যদি আপনার সিস্টেমে ভারসাম্য বজায় রাখতে mod_proxy ব্যবহার করেন তবে কর্মী সার্ভারের একটি গতিশীল পরিসর যুক্ত করা সম্ভব।

RewriteCond %{HTTP_COOKIE} ^.*stickysession=route\.server([0-9]{1,2}).*$ [NC]
RewriteRule (.*) https://worker%1.internal.com/$1 [P,L]

4

[এল] পতাকাটির আরও ভাল বোঝার ব্যবস্থা রয়েছে। [এল] পতাকা হল গত, আপনি শুধু বুঝতে কি হবে আপনার অনুরোধ করা URL পার্সিং ইঞ্জিন মাধ্যমে আবার পরাজিত করতে হবে। দস্তাবেজগুলি থেকে ( http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_l ) (জোর দেওয়া খনি):

[এল] পতাকাটির কারণে নিয়ম সেটটি প্রক্রিয়াজাতকরণ বন্ধ করার জন্য মোড_উরাইটের কারণ হয়। বেশিরভাগ প্রসঙ্গে, এর অর্থ হ'ল নিয়মটি যদি মেলে তবে আর কোনও বিধি প্রক্রিয়া করা হবে না। এটি পার্লের শেষ কমান্ডের সাথে মিলে যায় বা সি-তে ব্রেক কমান্ডের সাথে সামঞ্জস্য করে যে আরও নিয়ম বিবেচনা না করে বর্তমান নিয়মটি অবিলম্বে প্রয়োগ করা উচিত।

আপনি যদি htaccess ফাইলগুলিতে বা <Directory>বিভাগগুলিতে RewritRule ব্যবহার করছেন তবে বিধিগুলি কীভাবে প্রক্রিয়াজাত হয় সে সম্পর্কে কিছুটা বোঝা গুরুত্বপূর্ণ। এর সরলিকৃত ফর্মটি হ'ল একবার নিয়মগুলি প্রক্রিয়া করা হয়ে গেলে, পুনরায় লিখিত অনুরোধটি ইউআরএল পার্সিং ইঞ্জিনের কাছে ফেরত দেওয়া হয় যাতে এটি তার সাথে কী করতে পারে। এটা সম্ভব যে পুনর্লিখিত অনুরোধটি হ্যান্ডেল হওয়ার সাথে সাথে .htaccess ফাইল বা<Directory> বিভাগটি আবার সম্মুখীন হতে পারে এবং এইভাবে নিয়মসেটটি আবার শুরু থেকেই চালানো যেতে পারে। অভ্যন্তরীণ বা বাহ্যিক - কোনও নিয়মের একটি পুনর্নির্দেশের কারণ হিসাবে যদি অনুরোধ প্রক্রিয়াটি শুরু হওয়ার কারণ হয় তবে বেশিরভাগ ক্ষেত্রে এটি ঘটবে।

সুতরাং [এল] পতাকাটি নিয়ম সেটটির মধ্য দিয়ে সেই পাসের জন্য পুনরায় লেখার আরও কোনও নিয়ম প্রক্রিয়া বন্ধ করে দেয় । তবে, যদি আপনার নিয়মটি [এল] দিয়ে চিহ্নিত করে অনুরোধটি সংশোধিত করে এবং আপনি .htaccess প্রসঙ্গে বা বিভাগে থাকেন তবে আপনার পরিবর্তিত অনুরোধটি আবার ইউআরএল পার্সিং ইঞ্জিনের মাধ্যমে ফিরে যেতে চলেছে। এবং পরের পাসে, এটি এবার অন্য একটি নিয়মের সাথে মেলে। কী হয়েছে তা যদি আপনি বুঝতে না পারেন তবে দেখে মনে হচ্ছে [এল] পতাকাযুক্ত আপনার প্রথম পুনর্লিখনের কোনও প্রভাব নেই।<Directory>

এই সমস্যা এড়ানোর সবচেয়ে ভালো উপায় [শেষ] পতাকা (ব্যবহার করা http://httpd.apache.org/docs/current/rewrite/flags.html#flag_end [এল] পতাকা পরিবর্তে), যদি তোমরা নিষ্ঠার বন্ধ করতে চান বিধিগুলির সমস্ত পরবর্তী প্রক্রিয়াজাতকরণ (এবং পরবর্তী পুনর্বিবেচনা)। তবে, [END] পতাকাটি কেবল অ্যাপাচি v2.3.9 + এর জন্য উপলভ্য, সুতরাং আপনার যদি ভি 2.2 বা তার চেয়ে কম থাকে তবে আপনি কেবলমাত্র [এল] পতাকার সাথে আটকে আছেন। এই ক্ষেত্রে, ইউআরএল পার্সিং ইঞ্জিনের পরবর্তী পাসগুলিতে বিধি মেলানো রোধ করতে আপনাকে অবশ্যই রাইরাইটকন্ড বিবৃতিতে নির্ভর করতে হবে। অথবা আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার RewritRule এর কোনও প্রসঙ্গে রয়েছে (অর্থাত্ httpd.conf) যা আপনার অনুরোধটিকে পুনরায় বিশ্লেষণের কারণ করবে না।


3

আর একটি দুর্দান্ত বৈশিষ্ট্য হ'ল পুনর্লিখন-মানচিত্র-সম্প্রসারণ। এগুলি বিশেষত কার্যকর যদি আপনার কাছে পরিচালনা করার জন্য হোস্ট / রাইটারিটদের বিশাল পরিমাণ থাকে:

এগুলি কী-মান-প্রতিস্থাপনের মতো:

RewriteMap examplemap txt:/path/to/file/map.txt

তারপরে আপনি আপনার বিধিগুলিতে ম্যাপিং ব্যবহার করতে পারেন যেমন:

RewriteRule ^/ex/(.*) ${examplemap:$1}

এই বিষয় সম্পর্কে আরও তথ্য এখানে পাওয়া যাবে:

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#mapfunc


আপনি যদি .htaccessভিত্তিক পুনর্লিখন ব্যবহার করেন তবে এই বৈশিষ্ট্যটি উপেক্ষা করুন । এটি এই প্রসঙ্গে কাজ করে না।
টেরি

2
RewritMap নির্দেশিকা অবশ্যই সার্ভারের প্রসঙ্গে (httpd.conf) ব্যবহার করা উচিত তবে একবার সেখানে সংজ্ঞায়িত হয়ে গেলে আপনি একটি .htaccess ফাইলে RewritRule এর মাধ্যমে মানচিত্রটি ব্যবহার করতে পারেন।
জ্যারেডিস

2

মোড_উইরাইট URL টি পরিবর্তন না করে অনুরোধ পরিচালনার দিকগুলি পরিবর্তন করতে পারে, যেমন পরিবেশের ভেরিয়েবলগুলি সেট করা, কুকিজ সেট করা ইত্যাদি This এটি অবিশ্বাস্যভাবে কার্যকর।

শর্তাধীন পরিবেশে পরিবর্তনশীল সেট করুন:

RewriteCond %{HTTP_COOKIE} myCookie=(a|b) [NC]
RewriteRule .* - [E=MY_ENV_VAR:%b]

একটি 503 প্রতিক্রিয়া ফিরিয়ে দিন : RewriteRuleএর [R]পতাকাটি একটি অ-3xx মান নিতে পারে এবং একটি পুনর্নির্দেশের প্রতিক্রিয়া দিতে পারে, যেমন পরিচালিত ডাউনটাইম / রক্ষণাবেক্ষণের জন্য:

RewriteRule .* - [R=503,L]

একটি 503 প্রতিক্রিয়া ফিরিয়ে দেবে ( প্রতি সেডে পুনঃনির্দেশ নয় )।

এছাড়াও, মোড_আরাইট মডেলপ্রক্সিতে একটি সুপার পাওয়ার চালিত ইন্টারফেসের মতো কাজ করতে পারে, সুতরাং আপনি ProxyPassনির্দেশাবলী লেখার পরিবর্তে এটি করতে পারেন :

RewriteRule ^/(.*)$ balancer://cluster%{REQUEST_URI} [P,QSA,L]

মতামত: অনুরোধের কার্যত যে কোনও অনুমানযোগ্য দিকের উপর ভিত্তি করে বিভিন্ন অ্যাপ্লিকেশনগুলিতে বা লোড ব্যালান্সারের কাছে অনুরোধগুলি রুট করতে RewriteRules এবং RewriteConds ব্যবহার করা কেবলমাত্র অত্যন্ত শক্তিশালী। ব্যাক-এন্ডে যাওয়ার পথে অনুরোধগুলি নিয়ন্ত্রণ করা এবং তাদের প্রতিক্রিয়াগুলি ফিরে আসার ক্ষেত্রে পরিবর্তন করতে সক্ষম হওয়া, সমস্ত রাউটিং-সম্পর্কিত কনফিগারেশনের কেন্দ্রীভূত করার জন্য মোড_প্রিটকে আদর্শ জায়গা করে তোলে।

এটি শিখতে সময় নিন, এটির পক্ষে এটি ভাল! :)

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