Htaccess ব্যবহার করে সমস্তকে index.php এ পুনঃনির্দেশ করুন


131

আমি একটি সাধারণ পিএইচপি-ভিত্তিক এমভিসি-ইশ ফ্রেমওয়ার্ক লিখছি। আমি চাই যে এই কাঠামোটি কোনও ডিরেক্টরিতে ইনস্টল হতে সক্ষম হোক।

আমার পিএইচপি স্ক্রিপ্টটি অনুরোধটি ইউরি ধরবে এবং সেগমেন্টে বিভক্ত হয়ে যায়। এটি বিভাগটিকে 1 কে নিয়ামক এবং বিভাগ 2 কে ক্রিয়া করে। আমি যখন এটি করি তখন এটি ঠিক হয়ে যায়:

http://www.example.com/mvc/module/test/

এটি নির্দিষ্ট মডিউল নিয়ামক এবং পদ্ধতিতে যাবে। এখন আমার কাছে একটি ডিফল্ট নিয়ামক, হোম নিয়ামক, যা ফোল্ডার বাড়িতে রয়েছে।

এখন যখন আমি সরাসরি এই ফোল্ডারটি অ্যাক্সেস করি http://www.example.com/mvc/home/ এটি একটি 403 নিষিদ্ধ প্রদর্শন করবে, কারণ এই ফোল্ডারটি বিদ্যমান রয়েছে, পরিবর্তে এটি http://www.example.com এ ফিরে যেতে হবে /mvc/index.php

আমি যদি অন্য কোনও ফোল্ডারে ফ্রেমওয়ার্কটি ইনস্টল করে থাকি তবে ফোল্ডার ফ্রেমওয়ার্কটিকে এটি http://www.example.com/framework/index.php এ পুনঃনির্দেশ করতে হবে

আমি প্রতিটি ফোল্ডার এবং পিএইচপি ফাইলটিকে আবার সূচিপত্রে ফিরিয়ে আনতে চাই else

আমার প্রথম সমস্যার মুখোমুখি হ'ল এটি কখনই সঠিক ফোল্ডারে, সর্বদা ডোমেন রুট ফোল্ডারে পুনর্নির্দেশ করে না।

এটি আমি চেষ্টা করেছি:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]

কেবলমাত্র আমি নিশ্চিত হয়েছি যে আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পেরেছি: আপনি প্রতিটি অনুরোধকে মূলকে index.php পুনর্নির্দেশ করতে চান বা আপনি যে নির্দিষ্ট ফোল্ডারের প্রতি অনুরোধ করেছেন তা পুনঃনির্দেশ করতে চান index.php?
টেকনোহ

Htaccess ফাইলটি ফোল্ডারে, ফ্রেমওয়ার্ক রুট ডিরেক্টরি। আমার উদাহরণে এমভিসি ডিরেক্টরিতে ফিরে
ডেভিড এরিকসন

উত্তর:


259

আপনার পুনর্লিখনের নিয়মটি প্রায় ঠিক আছে।

প্রথমে নিশ্চিত হয়ে নিন যে আপনার .htaccessফাইলটি আপনার নথির মূলের (একই স্থানে index.php) রয়েছে বা এটি কেবলমাত্র এটির উপ-ফোল্ডারটিকেই প্রভাব ফেলবে (এবং এর মধ্যে যে কোনও উপ-ফোল্ডার - পুনরাবৃত্তভাবে)।

এরপরে আপনার নিয়মে কিছুটা পরিবর্তন আনুন তাই দেখে মনে হচ্ছে এটির মতো:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]

মুহূর্ত আপনি শুধু উপর মিলে দেবার .যা এক কোন চরিত্রের উদাহরণস্বরূপ, আপনি অন্তত প্রয়োজন .*কোনো চরিত্রের দৃষ্টান্ত যে কোন সংখ্যার মেলে।

$_GET['path']পরিবর্তনশীল তাই জাল ডিরেক্টরি গঠন উপস্থিত থাকবে, /mvc/module/testউদাহরণস্বরূপ, যেটি আপনি পরে index.php ব্যবহার করতে পারেন তা নির্ধারণ করার জন্য কন্ট্রোলার এবং কোন ক্রিয়াটি সঞ্চালন করতে চান।


আপনি যদি একটি উপ-ডিরেক্টরিতে পুরো শেবাং ইনস্টল করতে চান, যেমন /mvc/বা /framework/সর্বনিম্ন জটিল উপায় এটি হয় তবে তা আমলে নেওয়ার জন্য পুনর্লিখনের নিয়মটি সামান্য পরিবর্তন করা।

RewriteRule ^(.*)$ /mvc/index.php?path=$1 [NC,L,QSA]

এবং নিশ্চিত করুন যে ফাইলটি নথির মূলের index.phpমধ্যে রয়েছে that.htaccess


বিকল্প$_GET['path'] (আপডেট 'ফেব্রুয়ারী '18 এবং জানুয়ারী 1919)

এটি সেট করার জন্য প্রয়োজনীয় (কিংবা এখন একই) আসলে না পথ হিসেবে $_GETপরিবর্তনশীল অনেক অবকাঠামো উপর নির্ভর করবে $_SERVER['REQUEST_URI']একই তথ্য পুনরুদ্ধার করতে - স্বাভাবিকভাবে যা নির্ধারণ কন্ট্রোলার ব্যবহার করতে - কিন্তু নীতি ঠিক একই।

RewriteRuleআপনার পাথ প্যারামিটার তৈরি করার দরকার নেই বলে এটি কিছুটা সরল করে তোলে (যার অর্থ ওপেনের মূলটি এখন কাজ RewriteRule করবে ):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]

তবে সাব-ডিরেক্টরিতে ইনস্টল করার নিয়মটি এখনও প্রয়োগ হয়, যেমন

RewriteRule ^.*$ /mvc/index.php [L,QSA]



পতাকাগুলি:

NC = কোনও মামলা নেই (সংবেদনশীল নয়, প্রকৃত পক্ষে প্রয়োজনীয় নয় কারণ প্যাটার্নে কোনও অক্ষর নেই)

L = শেষ (এটি পুনরায় লেখার পরে এটি পুনরায় লেখা বন্ধ করে দেবে তাই নিশ্চিত হয়ে নিন যে এটি আপনার পুনর্লিখনের তালিকার শেষ জিনিস)

QSA= ক্যারিিং স্ট্রিং সংযোজন, ?like=penguinsসেক্ষেত্রে আপনি শেষের মতো এমন কিছু পেয়েছেন যা আপনি রাখতে চান এবং index.php এ যেতে চান।


1
এটি index.php? পাথ = $ 1 হওয়া উচিত
জেসেক পিটাল

1
@Prozi না আপনি একটি উপ-ডিরেক্টরির মধ্যে হন এবং index.php , docroot হয় তারপর আপনি নেতৃস্থানীয় প্রয়োজন / - দিয়ে Options +Indexesএবং index.php অন্তর্ভুক্ত মধ্যে DirectoryIndexআপনি পারে বন্ধ ছেড়ে index.php পুরাপুরি এবং মাত্র ব্যবহার /?path=$1এই সত্য যখন ঝুলিতে একটি httpd-vhosts.conf <Directory>টাইপ নির্দেশিকা পরিবর্তে .htaccess মাধ্যমে পুনর্লিখন করা ।
CD001

আপনি যদি এটি ব্যবহার করেন এবং $ _GET ['পাথ'] এর উপর নির্ভর করেন তবে আপনি
এনজিএনএক্স

3
চমৎকার পোস্ট! ব্যবহারকারীরা ইউআরএল $_GET['path']যুক্ত করলে তারা ওভাররাইট করতে পারে তা লক্ষ্য path=whateverকরার মতো।
rybo111

1
@ লিভিউজ - সত্য, তবে প্রথমদিকে আমি পুরো পথটি অতিক্রম করছিলাম $_GETযাতে এটির প্রয়োজন হত (.*)... এটি মজার বিষয় তবে রাইরাইটরুলেট the বছর আগে ওপি তাদের পক্ষে কাজ করে নি - তবে এমভিসি আর্কিটেকচারের যে পদ্ধতিতে রয়েছে পিএইচপি দিয়ে বিকশিত হয়েছে (আমি আপডেট ফেব্রুয়ারি 18 বিট হিসাবে রেখেছি ) এটি এখন হবে ... অনুমান করুন তারা তাদের সময়ের চেয়ে এগিয়ে ছিল :) এখনও /mvc/অবশ্যই ডিরেক্টরিটির সঠিক পথের প্রয়োজন ।
CD001

28

যার অস্তিত্ব নেই তা পুনর্নির্দেশ index.phpকরতে আপনি FallBackResourceনির্দেশটিও ব্যবহার করতে পারেন

FallbackResource /index.php

এটি ErrorDocumentসার্ভারে কোনও অস্তিত্বহীন পাথ বা ফাইলের অনুরোধ করার সময় এটির মতোই কাজ করে, নির্দেশটি নীরবে অনুরোধটিকে অনুরোধ করে index.php

আপনি যদি সমস্ত কিছু ( including existant files or folders) এ পুনর্নির্দেশ করতে চান তবে আপনি index.phpনীচের মতো কিছু ব্যবহার করতে পারেন:

RewriteEngine on

RewriteRule ^((?!index\.php).+)$ /index.php [L]

নীতিটি অসীম লুপিং ত্রুটি প্রতিরোধের জন্য গন্তব্য পথটি বাদ না দিয়ে ^((?!index\.php).+)$ কোনও ইউরির সাথে মেলে নোটটি নোট করুন index.php


তবে আপনি এটিও ব্যবহার করতে চাইতে পারেন:DirectoryIndex index.php
শাও

1
আপনি যদি রুট পাথ নিজেই পুনঃনির্দেশ করতে চান তবে প্যাটার্নের *পরিবর্তে ব্যবহার করুন +
মীর-ইসমাইলি

15

আপনি এর মতো কিছু ব্যবহার করতে পারেন:

RewriteEngine on
RewriteRule ^.+$ /index.php [L]

এটি প্রতিটি ক্যোয়ারিকে রুট ডিরেক্টরিটির সূচক। পিএফপিতে পুনর্নির্দেশ করবে। মনে রাখবেন যে এটি বিদ্যমান ফাইলগুলির জন্য যেমন পুনরুদ্ধার করবে যেমন চিত্র, জাভাস্ক্রিপ্ট ফাইল বা স্টাইল শীট।


1
এই সমাধানটি প্রায় আমার জন্য কাজ করেছিল। আমি "এএইচ 00124: অনুরোধটি 10 ​​অভ্যন্তরীণ পুনঃনির্দেশগুলির সীমা অতিক্রম করেছে" পেয়েছি। আমি আগে "RewritRule ^ index \। Php - [L]" যুক্ত করেছি এবং এটি পুরোপুরি কার্যকর হয়!
ফ্রেডস্টার

11

এই সমস্যার জন্য একটি "কৌশল" রয়েছে যা সমস্ত দৃশ্যের সাথে খাপ খায়, এটি একটি সুস্পষ্ট সমাধান যা আপনাকে এটি কার্যকরী বিশ্বাস করার জন্য চেষ্টা করতে হবে ... :)

এটা এখানে...

<IfModule mod_rewrite.c>

   RewriteEngine On

   RewriteCond %{REQUEST_FILENAME}  -f [OR]
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^(.*)$ index.php [L,QSA]

</IfModule>

মূলত, আপনি যখন কোনও ফাইল উপস্থিত থাকে এবং সর্বদা যখন অনুরোধকৃত ফাইলটি উপস্থিত না থাকে তখন সর্বদা ইউআরআই অনুরোধে ফরোয়ার্ড করার জন্য আপনি MOD_REWRITE কে জিজ্ঞাসা করছেনindex.php !

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

সেই সাধারণ আবিষ্কারের উপর ভিত্তি করে, স্পষ্টভাবে প্রমাণিত হয়েছে যে কোনও সম্ভাব্য কলগুলির জন্য একটি সাধারণ ফাইলের বৈধতা যথেষ্ট হবে , যতক্ষণ না আমরা ফাইল উপস্থিতি যাচাই করে ডাবল-ট্যাপ করি এবং সম্ভাব্যতার 100% কভার করে উভয় ফলাফলকে একই প্রান্তে পৌঁছে দেই।

গুরুত্বপূর্ণ: লক্ষ্য করুন যে এখানে " / " নেই index.php। ডিফল্টরূপে, MOD_REWRITE ফরোয়ার্ডিংয়ের জন্য এটি "বেস ফোল্ডার" হিসাবে সেট করা ফোল্ডারটি ব্যবহার করবে। এর সৌন্দর্য এটি হ'ল এটির "রুট ফোল্ডার" হওয়ার প্রয়োজন হয় না, এই সমাধানটি localhost/এবং / অথবা আপনি যে কোনও সাবফোল্ডার প্রয়োগ করেন তার জন্য এটির অনুমতি দেয়।

শেষ পর্যন্ত, আমি এর আগেও পরীক্ষিত কিছু অন্যান্য সমাধান (যেগুলি ভাল কাজ করে বলে মনে হয়েছিল) পিএইচপি তার ফাইলটিকে আপেক্ষিক পথ ধরে "প্রয়োজনীয়" করার ক্ষমতাকে ভেঙে দেয়, এটি একটি ঝাঁকুনির মতো। সতর্ক হোন.

কিছু লোক বলতে পারে এটি একটি অনুচিত সমাধান। এটি প্রকৃতপক্ষে, তবে যতদূর পরীক্ষা হিসাবে দেখা যায় বিভিন্ন পরিস্থিতিতে, বেশ কয়েকটি সার্ভারে, বিভিন্ন বিভিন্ন অ্যাপাচি সংস্করণে, ইত্যাদি ক্ষেত্রে, এই সমাধানটি সমস্ত ক্ষেত্রে 100% কাজ করেছিল!


ধন্যবাদ, এটি আমার সমস্যার সমাধান করেছে যার মাধ্যমে একটি FallbackResource index.phpলাইন একটি ম্যাক (ওএস এক্স 10.11) এ কাজ করেছে তবে সেন্টোস 7.5 এর অধীনে হয়নি। তবে: এটি RewriteRuleউদাহরণস্বরূপ সিএসএস ফাইলগুলির অবস্থান পুনর্লিখন করে। যেহেতু আমাকে কেবলমাত্র পিএইচপি ফাইলগুলি পুনঃনির্দেশ করা দরকার, তাই আমি এই নিয়মে সংশোধন করেছি RewriteRule ^(.*)php$ index.php [L,QSA]। YMMV।
ল্যারিক্স ডিসিডুয়া

1
আমি এটা খুশি খুশি। আপনি ঠিক বলেছেন, এটি সমস্ত ফাইলকে লক্ষ্যবস্তু করে কারণ প্রশ্নটি ছিল: " এইচটিএক্সেস ব্যবহার করে সমস্ত সূচকে পুনর্নির্দেশ করুন "। কেবল পিএইচপি ফাইলগুলি পুনঃনির্দেশ করার জন্য আরও অনেক মার্জিত উপায় রয়েছে, যেমন RewriteRule ^(.*)\.php$ index.php [L,NE,QSA](যার জন্য কাজ করার কোনও শর্ত নেই)। আজকাল, তবে আমি আরও সুলভ নিয়ম ব্যবহার করি: RewriteRule ^.+$ index.php [L,NE,QSA]যা শর্তগুলির সাথে একত্রিত হতে পারে RewriteCond %{REQUEST_FILENAME} !-fএবং RewriteCond %{REQUEST_FILENAME} !-dএমনকি RewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico)সত্যই সুনির্দিষ্ট হতে পারে।
জুলিও মার্চি

5

নির্বিকার উত্তর কিন্তু আপনি যদি এটি অনুধাবন করতে না পারেন যে এটি কেন পুনঃনির্দেশ করছে না তা নীচের ওয়েব ফোল্ডারের জন্য সক্ষম কিনা তা চেক করুন ..

AllowOverride All

এটি আপনাকে htaccess চালাতে সক্ষম করবে যা অবশ্যই চলমান হবে! (সেখানে বিকল্প আছে কিন্তু না সমস্যার সৃষ্টি হবে https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride )


0

করার পরে বাড়িতে আপনার অ্যাঙ্কর ট্যাগটি পরিবর্তন করতে ভুলবেন না

উদাহরণ:

.htacces file
RewriteEngine On

RewriteRule ^about/$ /about.php

PHP file:
<a href="about/"> about</a>

<a> ট্যাগ পরিবর্তন করতে সর্বদা মনে রাখবেন।
কলিনস বেনসন

2
কি আপনার ট্যাগ পরিবর্তন করতে না, হোম করছেন পরে মানে?
এনরিকো মারিয়া ডি অ্যাঞ্জেলিস

0

কেবলমাত্র যদি আপনি এখনও ভাবছিলেন যে কীভাবে ডিরেক্টরিটি বিদ্যমান (মূল কাঠামোর ফোল্ডার এবং ফাইলগুলির জন্য) ফ্রেমওয়ার্ক সূচক হ্যান্ডলারের কাছে উপস্থিত রয়েছে তবে কিছু ত্রুটি / সাফল্যের প্রচেষ্টা সত্ত্বেও আমি কেবলমাত্র .htaccess এ রাইরাইটকন্ড পরিবর্তন করার প্রয়োজন ছিল ফাইল

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

উপরের শর্তটি "ফাইলগুলি খুঁজে পাওয়া যায়নি" এবং "ডিরেক্টরিগুলি খুঁজে পাওয়া যায়নি" বলে ঠিক আছে, ঠিক আছে, "সন্ধান পেল না" (! -d) লাইনটি সরিয়ে যদি নীচের মতো কিছু দিয়ে শেষ হয়:

RewriteEngine on
RewriteBase /framework/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /framework/index.php [L,QSA]

এটি আমার জন্য কবজির মতো কাজ করেছিল

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