রাইরাইটবেস .htaccess এ কীভাবে কাজ করে


227

আমি এটি কয়েকটি .htaccessউদাহরণে দেখেছি

RewriteBase /

এটি <base href="">HTML এর কার্যকারিতার ক্ষেত্রে কিছুটা মিল রয়েছে বলে মনে হয় ।

আমি বিশ্বাস করি যে এটি RewriteRuleবিবৃতি শুরুর আগে স্বয়ংক্রিয়ভাবে এর মানটি সংশোধন করতে পারে (সম্ভবত কোনও শীর্ষস্থানীয় স্ল্যাশ ছাড়াই)?

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

কেউ কীভাবে এটি বাস্তবায়ন করবেন সংক্ষেপে আমাকে ব্যাখ্যা করতে পারেন?

ধন্যবাদ



পুনর্লিখনটি কেবল ডিরেক্টরি বা .htaccess প্রসঙ্গে কাজ করে ... লিঙ্কের জন্য স্যালামনপিকে প্রদত্ত লিঙ্কটির প্রসঙ্গটি দেখুন।
এডি বি

1
ভাল বর্ণনার জন্য এই উত্তরটি দেখুন। stackoverflow.com/a/2137593/292060
goodeye

1
: এটি একটি আরো মধ্যে গভীরতা উত্তর stackoverflow.com/a/21348047/632951
Pacerier

এই একটি 1-লাইন উত্তর stackoverflow.com/a/46541685/632951
Pacerier

উত্তর:


102

ডকসটি পড়ে এবং পরীক্ষার পরে আমার নিজের ভাষায়:

আপনি আপনার পুনর্লিখনের জন্য RewriteBaseএকটি বেস সরবরাহ করতে ব্যবহার করতে পারেন । এই বিবেচনা

# invoke rewrite engine
    RewriteEngine On
    RewriteBase /~new/

# add trailing slash if missing
    rewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L]

এটি একটি বাস্তব নিয়ম যা আমি নিশ্চিত হয়েছি যে ইউআরএলগুলির একটি পিছনে স্ল্যাশ রয়েছে used এটি রূপান্তরিত হবে

http://www.example.com/~new/page

প্রতি

http://www.example.com/~new/page/

RewriteBaseসেখানে থাকার পরে , আপনি আপেক্ষিক পথটি RewriteBaseপ্যারামিটারটি বন্ধ করে দিন ।


10
"রিরাইটবেস প্যারামিটারটি বন্ধ করুন" - আপনি কি পুনর্লিখনের নিয়মিত পরামিতিটি বোঝাতে চেয়েছিলেন? :)
কিসাকি

1
আমি htaccess সম্পর্কে কিছু বিবরণ পরিষ্কার করতে চাই .. একটি ReWriteBase তার ঘোষণার পরে কি এইচটিসেসের সমস্ত নিয়মের জন্য সেট করে ? এটি আনসেট করার কোনও উপায় আছে কি এটি পুনরায় সেট করা যায়?
দামন

3
@ কিসাকি: না, প্রথম বন্ধনীযুক্ত পুনরায় লেখার নিয়মের সাথে $1মেলে, কিন্তু প্রতিস্থাপনের জন্য আপেক্ষিক পথটি রাইরাইটবেস প্যারামিটারের বাইরে চলে আসে। সুতরাং, ফলাফল প্রতিস্থাপন হয় /~new/$1/
মিঃ হোয়াইট

3
@ ড্যামন: একাধিক নির্দেশনা সম্পর্কিত এই প্রশ্নটি দেখুন RewriteBase। সংক্ষেপে, আপনার একের বেশি থাকতে পারে না - আমি মনে করি শেষ RewriteBase নির্দেশটি জিততে পারে এবং পুরো .htaccess ফাইলটিকে প্রভাবিত করে।
মিঃ হোয়াইট

24
-1; এই উত্তরটি অন্যকে সাহায্য করেছে বলে মনে হয় তবে এটি আমার কাছে সম্পূর্ণ অস্বচ্ছ। আমি অনুমান করতে পারি যে "আপনি RewriteBaseআপনার পুনর্লিখনের জন্য একটি বেস সরবরাহ করতে ব্যবহার করতে পারেন " - এটি শব্দের একটি মাত্র পুনর্বিন্যাস - তবে এই প্রসঙ্গে "বেস" কী এবং আমার কী ধারণা আছে তা আমার কোনও ধারণা নেই উদাহরণস্বরূপ আপনি প্রদত্ত RewriteBaseলাইনটি সরানো থাকলে আলাদা হবে । আমি যাচ্ছি সেই ম্যানুয়ালটিতে ...
মার্ক অ্যামেরি

89

RewriteBaseশুধুমাত্র প্রয়োগ করা হয় লক্ষ্য একটি এর আপেক্ষিক লেখা নিয়ম।

  • রিটারাইটবেস এভাবে ব্যবহার করা হচ্ছে ...

    RewriteBase /folder/
    RewriteRule a\.html b.html
    
  • মূলত একই ...

    RewriteRule a\.html /folder/b.html
    
  • .Htaccess ফাইলটি যখন ভিতরে থাকে /folder/তখন এটি একই লক্ষ্যকেও নির্দেশ করে:

    RewriteRule a\.html b.html
    

যদিও দস্তাবেজগুলি সর্বদা একটি ব্যবহার করে বোঝায় RewriteBase, অ্যাপাচি সাধারণত ডকুমেন্টরোটের অধীনে পাথগুলির জন্য এটি সঠিকভাবে সনাক্ত করে:

  • আপনি Aliasনির্দেশাবলী ব্যবহার করছেন

  • আপনি আপেক্ষিক ইউআরএলগুলিতে এইচটিটিপি পুনর্নির্দেশগুলি (কেবল নীরব পুনর্লিখনের চেয়ে) সম্পাদনা করতে .htaccess পুনর্লিখনের নিয়মগুলি ব্যবহার করছেন

এই ক্ষেত্রে, আপনি রিউরাইটবেস নির্দিষ্ট করার প্রয়োজন হতে পারে।

তবে এটি যেহেতু একটি বিভ্রান্তিকর নির্দেশিকা, তাই আপনার পুনর্লিখনের লক্ষ্যগুলিতে কেবল নিখুঁত (ওরফে 'রুট আত্মীয়') ইউআরআই নির্দিষ্ট করা ভাল। আপনার বিধিগুলি পড়ার অন্যান্য বিকাশকারীরা এগুলি আরও সহজেই উপলব্ধি করতে পারবেন।



জন লিনের দুর্দান্ত গভীরতার উত্তরটি এখানে উদ্ধৃত :

একটি 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/

এবং এটাই.


আমার জন্য, আমি মিস করেছি RewriteEngine On। উদাহরণস্বরূপ 1and1 এ কোনও প্রয়োজন নেই তবে এটি আমার ডেডিকেটেড সার্ভারে প্রয়োজন required
পোর্তেকোই

41

এএফআইএইসি, রাইরাইটবেস কেবলমাত্র কেসগুলি ঠিক করার জন্য ব্যবহৃত হয় যেখানে .htaccessকোনও সাইটের মূলের পরিবর্তে কোনও ফাইলের মধ্যে মোড_উইউরাইট চলমান থাকে এবং এটি যে ফোল্ডারে চলছে সেটার জন্য এটি ওয়েব ওয়েব পাথ (ফাইল সিস্টেমের বিপরীতে) অনুমান করে you আপনার ফোল্ডারে ম্যাপ http://example.com/myfolderব্যবহার করতে পারে এমন ফোল্ডারে একটি .htaccess এ পুনর্লিখন করুন :

RewriteBase myfolder

যদি mod_rewrite সঠিকভাবে কাজ না করে isn't

এ সমস্যাটি সমাধানের চেয়ে এটি অস্বাভাবিক কিছু অর্জনের জন্য ব্যবহার করার চেষ্টা করা খুব বিভ্রান্ত হওয়ার কোনও রেসিপি বলে মনে হচ্ছে।


2
এটি কি শেষের স্ল্যাশ দিয়ে শেষ হওয়া দরকার?
পেসারিয়ার

: @self নং পরিক্ষিত, এবং এখানে উপ-ব্যাখ্যা stackoverflow.com/a/11443194/632951
Pacerier

23

রাইরাইটবেস কেবলমাত্র সেই পরিস্থিতিতে কার্যকর যখন আপনি কেবল আপনার সাইটের মূলটিতে একটি .htaccess রাখতে পারবেন। অন্যথায়, আপনি আপনার সাইটের বিভিন্ন ডিরেক্টরিতে আপনার আলাদা .htaccess ফাইলগুলি স্থাপন এবং পুনর্নির্মাণের নির্দেশিকা সম্পূর্ণরূপে বাদ দেওয়া থেকে ভাল।

ইদানীং, জটিল সাইটগুলির জন্য, আমি সেগুলি বাইরে নিয়ে যাচ্ছি, কারণ এটি পরীক্ষার থেকে আরও এক ধাপ জটিল করে দেওয়ার জন্য ফাইলগুলি স্থাপন করে।


22
যদিও এটি ভাল পরামর্শ হতে পারে তবে এটি মোটেই প্রশ্নের উত্তর নয়। এটি এইভাবে প্রশ্নের একটি মন্তব্য হওয়া উচিত ছিল, (যতগুলি) উর্ধ্বতন প্রাপ্ত হয়নি এবং অবশ্যই "উত্তর" হিসাবে স্বীকৃত হয়নি।
কিসাকি

3
"আপনার বিভিন্ন .htaccess ফাইলগুলি বিভিন্ন ডিরেক্টরিতে রেখে দেওয়া ভাল" - আমি নিশ্চিত নই যে এটি ভাল পরামর্শ? আপনার সাইট জুড়ে ডট করা .htaccess ফাইলগুলি ডিবাগিং / রক্ষণাবেক্ষণকে দুঃস্বপ্ন করতে পারে। আমি বলেন না এটি ছিল বাঞ্ছনীয় আপনার সাইটের রুট এক .htaccess ফাইল আছে।
মিঃহাইট

1
@ w3d একটি সময়সীমার বিষয়টিও রয়েছে: প্রতিবারে একটি উপ-ডিরেক্টরি অ্যাক্সেস করা হয়, একাধিক .htaccess ফাইলগুলি পার্স করা হয় (মূল থেকে বর্তমান উপ-ডিরেক্টরিতে)। যেমন রুট একটি একক ফাইল উল্টোদিকে ফাইল অনেক, অনুরোধ সামগ্রিক উত্তর গতি কমে পারে রয়ে, যদিও তা নিয়ম অনেক রয়েছে ..
Erenor পাজ

19

আমি যখন বিকাশ করি তখন এটি কোনও ফোল্ডারের মধ্যে একটি ভিন্ন ডোমেনে থাকে। আমি যখন কোনও সাইট লাইভ নিই, তখন সেই ফোল্ডারটি আর উপস্থিত থাকে না। রিরাইটবেস ব্যবহার করা আমাকে উভয় পরিবেশে একই .htaccess ফাইল ব্যবহার করতে দেয়।

লাইভ:

RewriteBase /
# RewriteBase /dev_folder/

যখন বিকাশ:

# RewriteBase /
RewriteBase /dev_folder/

4
আমি নিশ্চিত যে এটি সর্বদা কার্যকর হবে না। উদাহরণস্বরূপ আপনি %{REQUEST_URI}যদি কোনও RewriteCondনির্দেশিকা ব্যবহার করেন তবে ?
মিঃহাইট

1
@ user1669830, আপনি শুধু এক rewriterule পেয়েছেন, তাহলে বেস rewriterule জুড়েছেন পারে stackoverflow.com/a/46541685/632951
Pacerier

18

আমি যে স্পষ্ট ব্যাখ্যাটি পেয়েছি তা বর্তমান ২.৪ অ্যাপাচি ডক্সে ছিল না, তবে সংস্করণ ২.০ এ ছিল

#  /abc/def/.htaccess -- per-dir config file for directory /abc/def
#  Remember: /abc/def is the physical path of /xyz, i.e., the server
#            has a 'Alias /xyz /abc/def' directive e.g.

RewriteEngine On

#  let the server know that we were reached via /xyz and not
#  via the physical path prefix /abc/def
RewriteBase   /xyz

এটা কিভাবে কাজ করে? আপনার অ্যাপাচি হ্যাকারদের জন্য, এই 2.0 ডকটি "অভ্যন্তরীণ প্রক্রিয়াজাতকরণের ধাপগুলি সম্পর্কে বিশদ তথ্য" দেয়।

পাঠ শিখেছে: যদিও আমাদের "বর্তমানের" সাথে পরিচিত হওয়া দরকার, তত্ক্ষণাতীতে রত্নগুলি পাওয়া যায়।


3

এই কমান্ডটি স্পষ্টভাবে আপনার পুনর্লিখনের জন্য বেস URL সেট করতে পারে। আপনি যদি আপনার ডোমেনের মূলটি শুরু করতে চান তবে আপনার পুনর্লিখনের আগে নিম্নলিখিত লাইনটি অন্তর্ভুক্ত করবেন:

RewriteBase /

2

আমি অ্যাপাচি ডকুমেন্টেশন থেকে এই উদ্ধৃতি বিশ্বাস করি, পূর্ববর্তী উত্তরগুলি পুরোপুরি পরিপূরক করে:

নিম্নলিখিত নির্দেশাবলীর যে কোনওটি সত্য না হলে আপনি যখন প্রতি ডিরেক্টরি (এইচটিসেসি) প্রসঙ্গে বিকল্পের ক্ষেত্রে কোনও আপেক্ষিক পথ ব্যবহার করেন তখন এই নির্দেশিকাটির প্রয়োজন হয়:

  • মূল অনুরোধ এবং প্রতিস্থাপনটি ডকুমেন্ট রুটের নীচে রয়েছে (যেমন অন্য উপায়ে যেমন এলিয়াসের মাধ্যমে পৌঁছনোর বিপরীতে)।

  • RewritRule সম্বলিত ডিরেক্টরিটিতে ফাইল সিস্টেমের পাথ, যা আপেক্ষিক প্রতিস্থাপন দ্বারা প্রত্যয়যুক্ত সার্ভারের ইউআরএল পাথ হিসাবে বৈধ ((এটি বিরল)।

পূর্বে উল্লিখিত হিসাবে, অন্যান্য প্রসঙ্গে, এটি কেবল আপনার নিয়মকে খাটো করার জন্য দরকারী। তদুপরি, পূর্বে উল্লিখিত হিসাবে, আপনি সাব-ডিরেক্টরিতে htaccess ফাইল স্থাপন করে একই জিনিস অর্জন করতে পারেন।

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