RewriteBase
শুধুমাত্র প্রয়োগ করা হয় লক্ষ্য একটি এর আপেক্ষিক লেখা নিয়ম।
রিটারাইটবেস এভাবে ব্যবহার করা হচ্ছে ...
RewriteBase /folder/
RewriteRule a\.html b.html
মূলত একই ...
RewriteRule a\.html /folder/b.html
.Htaccess ফাইলটি যখন ভিতরে থাকে /folder/
তখন এটি একই লক্ষ্যকেও নির্দেশ করে:
RewriteRule a\.html b.html
যদিও দস্তাবেজগুলি সর্বদা একটি ব্যবহার করে বোঝায় RewriteBase
, অ্যাপাচি সাধারণত ডকুমেন্টরোটের অধীনে পাথগুলির জন্য এটি সঠিকভাবে সনাক্ত করে:
এই ক্ষেত্রে, আপনি রিউরাইটবেস নির্দিষ্ট করার প্রয়োজন হতে পারে।
তবে এটি যেহেতু একটি বিভ্রান্তিকর নির্দেশিকা, তাই আপনার পুনর্লিখনের লক্ষ্যগুলিতে কেবল নিখুঁত (ওরফে 'রুট আত্মীয়') ইউআরআই নির্দিষ্ট করা ভাল। আপনার বিধিগুলি পড়ার অন্যান্য বিকাশকারীরা এগুলি আরও সহজেই উপলব্ধি করতে পারবেন।
জন লিনের দুর্দান্ত গভীরতার উত্তরটি এখানে উদ্ধৃত :
একটি htaccess ফাইলে, মোড_উইরাইট একটি <Directory>
বা <Location>
ধারক হিসাবে একই কাজ করে । এবং এটি RewriteBase
একটি আপেক্ষিক পাথ বেস সরবরাহ করতে ব্যবহৃত হয়।
উদাহরণস্বরূপ, বলুন যে আপনার এই ফোল্ডারটির কাঠামো রয়েছে:
DocumentRoot
|-- subdir1
`-- subdir2
`-- subsubdir
সুতরাং আপনি অ্যাক্সেস করতে পারেন:
http://example.com/
(রুট)
http://example.com/subdir1
(Subdir1)
http://example.com/subdir2
(Subdir2)
http://example.com/subdir2/subsubdir
(Subsubdir)
ইউআরআই যা একটি এর মাধ্যমে প্রেরিত হয় RewriteRule
এটি htaccess ফাইলযুক্ত ডিরেক্টরি সম্পর্কিত। সুতরাং আপনার যদি:
RewriteRule ^(.*)$ -
- মূল htaccess এ, এবং অনুরোধটি হ'ল
/a/b/c/d
, তবে ধরা পড়া ইউআরআই ( $1
) a/b/c/d
।
- যদি নিয়মটি থাকে
subdir2
এবং অনুরোধটি হয় /subdir2/e/f/g
তবে ধরা পড়া ইউআরআই e/f/g
।
- যদি নিয়মটি থাকে এবং
subsubdir
অনুরোধটি থাকে /subdir2/subsubdir/x/y/z
তবে ধরা পড়েছে ইউআরআই x/y/z
।
নিয়মটি যে ডিরেক্টরিটিতে রয়েছে সেই অংশটি ইউআরআই থেকে ছিটকে গেছে। পুনর্লিখনের বেসটির উপর এর কোনও প্রভাব নেই, এটি প্রতিটি ডিরেক্টরি অনুসারে কাজ করে।
কি লেখা বেস নেই না, একটি URL-পাথ বেস (প্রদান হয় না যে কোন আপেক্ষিক পাথ জন্য একটি ফাইল-পাথ বেস) নিয়ম এর লক্ষ্য । সুতরাং বলুন যে আপনার এই নিয়ম রয়েছে:
RewriteRule ^foo$ bar.php [L]
bar.php
যেমন বিরোধিতা একটি আপেক্ষিক পাথ হল:
RewriteRule ^foo$ /bar.php [L]
যেখানে /bar.php
একটি পরম পথ। পরম পথটি সর্বদা "মূল" হবে (উপরের ডিরেক্টরি কাঠামোর মধ্যে)। এর অর্থ হ'ল নিয়মটি "রুট", "সাবডির 1", "সাবসুবডির" ইত্যাদিতে রয়েছে কিনা তা নির্বিশেষে /bar.php
পথটি সর্বদা মানচিত্রের দিকে ম্যাপ করে http://example.com/bar.php
।
তবে অন্যান্য নিয়ম, আপেক্ষিক পাথ সহ এটি নিয়মের যে ডিরেক্টরিটি রয়েছে তার ভিত্তিতে based তাই যদি if
RewriteRule ^foo$ bar.php [L]
"মূল" এর মধ্যে রয়েছে এবং আপনি যান http://example.com/foo
, আপনাকে পরিবেশন করা হবে http://example.com/bar.php
। তবে যদি এই নিয়মটি "সাবডির 1" ডিরেক্টরিতে থাকে এবং আপনি যান http://example.com/subdir1/foo
, আপনি পরিবেশন করবেন http://example.com/subdir1/bar.php
। ইত্যাদি এটি কখনও কখনও কাজ করে এবং কখনও কখনও কাজ করে না, যেমন ডকুমেন্টেশন বলে, এটি আপেক্ষিক পাথের জন্য প্রয়োজন বলে মনে করা হয়, তবে বেশিরভাগ সময় এটি কাজ করে বলে মনে হয়। আপনি যখন পুনঃনির্দেশ করছেন তখন ব্যতীত ( R
পতাকাটি ব্যবহার করে বা স্পষ্টতই কারণ http://host
আপনার নিয়মের লক্ষ্য রয়েছে)। এর অর্থ এই নিয়ম:
RewriteRule ^foo$ bar.php [L,R]
যদি এটি "subdir2" ডিরেক্টরির মধ্যে, এবং আপনি যেতে http://example.com/subdir2/foo
, mod_rewrite একটি ফাইল-পাথ একটি URL-পথের পরিবর্তে আপেক্ষিক পাথ ভুল করবে এবং কারণ R
পতাকা, তোমার মত কিছু থেকে আপনাকে পুনঃনির্দেশিত পেয়ে শেষ করব: http://example.com/var/www/localhost/htdocs/subdir1
। যা অবশ্যই আপনি চান তা নয়।
এটি এখানেই RewriteBase
আসে The নির্দেশিকাটি প্রতিটি আপেক্ষিক পাথের শুরুতে কী যুক্ত করতে হবে তা mod_rewrite কে বলে। সুতরাং আমি যদি:
RewriteBase /blah/
RewriteRule ^foo$ bar.php [L]
"সাবসুবডির" এ, http://example.com/subdir2/subsubdir/foo
আসলে আমার সেবা করবে http://example.com/blah/bar.php
। "বার.এফপি" বেসের শেষে যুক্ত করা হয়। অনুশীলনে, এই উদাহরণটি সাধারণত আপনি যা চান তা তা নয়, কারণ একই ডিরেক্টরি ধারক বা htaccess ফাইলে আপনার একাধিক ঘাঁটি থাকতে পারে না।
বেশিরভাগ ক্ষেত্রে এটি ব্যবহার করা হয়:
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
যেখানে এই বিধিগুলি "subdir1" ডিরেক্টরিতে থাকবে এবং
RewriteBase /subdir2/subsubdir/
RewriteRule ^foo$ bar.php [L]
"সাবসুবডির" ডিরেক্টরিতে হবে।
এটি আংশিকভাবে আপনাকে আপনার বিধিগুলি পোর্টেবল করার অনুমতি দেয়, সুতরাং আপনি এগুলি যে কোনও ডিরেক্টরিতে ফেলে দিতে পারেন এবং নিয়মগুলির একগুচ্ছ পরিবর্তে কেবল ভিত্তি পরিবর্তন করতে হবে। উদাহরণস্বরূপ:
RewriteEngine On
RewriteRule ^foo$ /subdir1/bar.php [L]
RewriteRule ^blah1$ /subdir1/blah.php?id=1 [L]
RewriteRule ^blah2$ /subdir1/blah2.php [L]
...
যেমন এটি http://example.com/subdir1/foo
পরিবেশন করবে http://example.com/subdir1/bar.php
ইত্যাদি। এবং আপনি বলেছিলেন যে আপনি এই সমস্ত ফাইল এবং নিয়ম "সাবসুবডির" ডিরেক্টরিতে সরিয়ে নেওয়ার সিদ্ধান্ত নিয়েছেন। প্রতিটি উদাহরণের পরিবর্তন করার পরিবর্তে /subdir1/
করতে /subdir2/subsubdir/
, আপনি শুধু একটি বেস ছিল পারে:
RewriteEngine On
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
RewriteRule ^blah1$ blah.php?id=1 [L]
RewriteRule ^blah2$ blah2.php [L]
...
এবং তারপরে আপনার যখন সেই ফাইলগুলি এবং বিধিগুলি অন্য ডিরেক্টরিতে স্থানান্তরিত করার দরকার হয়, কেবল বেসটি পরিবর্তন করুন:
RewriteBase /subdir2/subsubdir/
এবং এটাই.