পিএইচপি দিয়ে ইউআরএল পুনর্লিখন


139

আমার মতো একটি ইউআরএল রয়েছে যা দেখতে:

url.com/picture.php?id=51

আমি কীভাবে সেই URL টি রূপান্তর করতে যাব:

picture.php/Some-text-goes-here/51

আমি মনে করি ওয়ার্ডপ্রেস একই কাজ করে।

আমি কীভাবে পিএইচপিতে বন্ধুত্বপূর্ণ ইউআরএল তৈরি করতে যাব?


1
অ্যাপাচি ফাইলগুলির কনফিগারেশনে আপনাকে প্রচুর টুইট করতে হবে ... আপনার আসলে যা প্রয়োজন তার একটি উদাহরণ দিন? আপনি এই পাঠ্যটি কীভাবে সন্নিবেশ করবেন? এটি পূর্বনির্ধারিত বা এটি গতিশীলভাবে তৈরি হয়েছে? সঠিক উত্তর পেতে যতটা সম্ভব তথ্য দিন ... এবং
হ'ল

1
পিএইচপি কেন? অ্যাপাচি এর mod_rewriteজন্য আপনার যা দরকার তা হ'ল এসও-তে এখানে অনেক প্রশ্ন রয়েছে। এবং যদি আপনি "মনে করেন" যে ওয়ার্ডপ্রেসটি একই কাজ করে তবে আপনি কেবল এটিকে সন্ধান করবেন না কেন ? ;)
নিটনফায়ার

পড়া mod_rewrite

তুমি কেন এটা করছ? URL এর পুনর্লিখন লক্ষ্যটি কি, যদি তাই। Htaccess ব্যবহার করে বা অনুরূপ কিছু ব্যবহার করে। যদি লক্ষ্যটি কেবল স্ট্রিং পরিবর্তন করা হয়, $ _GET কেবল ক্যোরিস্ট্রিং পায়?
অ্যাডেনেও

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

উত্তর:


194

আপনি মূলত এই 2 টি উপায়ে করতে পারেন:

মোড_উইরাইট সহ .htaccess রুট

.htaccessআপনার মূল ফোল্ডারে ডাকা একটি ফাইল যুক্ত করুন এবং এর মতো কিছু যুক্ত করুন:

RewriteEngine on
RewriteRule ^/?Some-text-goes-here/([0-9]+)$ /picture.php?id=$1

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

পিএইচপি রুট

পরিবর্তে আপনার .htaccess এ নিম্নলিখিতগুলি রাখুন: (শীর্ষস্থানীয় স্ল্যাশ নোট করুন)

FallbackResource /index.php

এটি এটিকে index.phpসমস্ত ফাইলের জন্য চালানোর জন্য বলবে যা এটি সাধারণত আপনার সাইটে খুঁজে পায় না। সেখানে আপনি উদাহরণস্বরূপ করতে পারেন:

$path = ltrim($_SERVER['REQUEST_URI'], '/');    // Trim leading slash(es)
$elements = explode('/', $path);                // Split path on slashes
if(empty($elements[0])) {                       // No path elements means home
    ShowHomepage();
} else switch(array_shift($elements))             // Pop off first item and switch
{
    case 'Some-text-goes-here':
        ShowPicture($elements); // passes rest of parameters to internal function
        break;
    case 'more':
        ...
    default:
        header('HTTP/1.1 404 Not Found');
        Show404Error();
}

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


এটি হার্ড-কোডিংয়ের পরিবর্তে, স্ট্রিংটিকে সম্পূর্ণ উপেক্ষা করার জন্য আপনি কেবল রেজেক্স ব্যবহার করতে পারেন। অন্য কথায়, একমাত্র জিনিস যা গণনা করে তা হ'ল আইডি অংশ। picture.php/invalid-text/51গিয়ে একই জায়গায় পুনর্নির্দেশ করা হবে। স্ট্রিংটি সঠিক কিনা তা দেখার জন্য আপনি একটি চেক যোগ করতে পারেন এবং না হলে সঠিক জায়গায় আবার পুনর্নির্দেশ করতে পারেন। আমি এইভাবে এইচটিএক্সেস ব্যবহার করে আমার একটি সাইটে এটি করেছি।
মাইক 21

7
ছোট সাইটগুলির জন্য সুবিধাজনক, তবে আপনাকে যদি /blog/25পাশাপাশি পার্স করতে হয় /picture/51এবং তবে বাস্তবিক ব্যবহারিক নয় /download/684। এছাড়াও, এটিকে খুব খারাপ অনুশীলন হিসাবে বিবেচনা করা হয় (এবং আপনাকে গুগল পিআর জরিমানা করা হয়!) যদি এলোমেলোভাবে উত্পন্ন সমস্ত ইউআরএলগুলি 404 সঠিকভাবে না ফেরায়
নীলস কেওরেন্টজেস 21

5
আমার সিস্টেমে কমপক্ষে, এটি ছিল FallbackResource /index.php(অগ্রণী স্ল্যাশটি নোট করুন)
জ্যাক জেমস

4
@ অলি: খারাপ অনুশীলনের মন্তব্যটি বিশেষত "অস্তিত্বের ইউআরএলগুলির জন্য 404 ফিরিয়ে না দেওয়া" বোঝায়, যা উত্তরের মধ্যেই সমাধানের মাধ্যমে সমাধান করা হয়। প্রথম প্রশ্ন হিসাবে - FallbackResourceশুধুমাত্র ফাইল সিস্টেমে প্রকৃতপক্ষে অস্তিত্ব নেই এমন ফাইলগুলির জন্য কিক্স করে, ফলে ফলব্যাক । সুতরাং আপনার যদি কোনও ফাইল থাকে /static/styles.cssএবং http://mydomain.tld/static/styles.cssকোডটি কখনই কার্যকর হয় না বলে তা উল্লেখ করুন, এটি এটিকে প্রত্যাশার মতো কাজ করে এবং স্বচ্ছতার সাথে লক্ষ্য করে।
নিলস কেওরেন্টজেস

if($elements[0] === NULL)পরিবর্তে আপনার ব্যবহার করা উচিত , যেমন $elementsএটি খালি থাকলেও এখনও একটির একটি গণনা ফিরিয়ে দেবে।
ফায়ারস্পেস

57

আপনি যদি কেবল তার জন্য রুট পরিবর্তন করতে চান picture.phpতবে পুনরায় লেখার নিয়মটি যুক্ত করা .htaccessআপনার প্রয়োজনীয়তা পরিবেশন করবে তবে আপনি যদি ওয়ার্ডপ্রেসের মতো ইউআরএল পুনর্লিখন চান তবে পিএইচপি হ'ল উপায়। এখানে দিয়ে শুরু করার সহজ উদাহরণ।

ফোল্ডার কাঠামো

মূল ফোল্ডারে দুটি ফাইলের প্রয়োজন রয়েছে .htaccessএবং index.php, এবং বাকী .phpফাইলগুলি আলাদা ফোল্ডারে যেমন রাখার মত ভাল হয় inc/

root/
  inc/
  .htaccess
  index.php

.htaccess

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

এই ফাইলটির চারটি নির্দেশ রয়েছে:

  1. RewriteEngine - পুনর্লিখন ইঞ্জিন সক্ষম করুন
  2. RewriteRule- inc/ফোল্ডারে সমস্ত ফাইলে অ্যাক্সেস অস্বীকার করুন , সেই ফোল্ডারে কোনও কল পুনর্নির্দেশ করুনindex.php
  3. RewriteCond - অন্যান্য সমস্ত ফাইলে (চিত্র, সিএসএস বা স্ক্রিপ্টগুলির মতো) সরাসরি অ্যাক্সেসের অনুমতি দিন
  4. RewriteRule - অন্য কিছুতে পুনর্নির্দেশ index.php

index.php

যেহেতু এখন সমস্ত কিছুই সূচি.এফপি তে পুনঃনির্দেশিত হয়েছে, ইউআরএল সঠিক কিনা, সমস্ত পরামিতি উপস্থিত রয়েছে এবং পরামিতিগুলির ধরণটি সঠিক কিনা তা নির্ধারিত হবে।

ইউআরএল পরীক্ষা করতে আমাদের নিয়মের একটি সেট থাকা দরকার এবং এটির জন্য সেরা সরঞ্জামটি একটি নিয়মিত প্রকাশ expression নিয়মিত এক্সপ্রেশন ব্যবহার করে আমরা একটি ঘা দিয়ে দুটি উড়ে মারা যাব। ইউআরএল, এই পরীক্ষাটি পাস করার জন্য অনুমোদিত অক্ষরগুলির উপর পরীক্ষিত সমস্ত প্রয়োজনীয় পরামিতি থাকতে হবে। এখানে নিয়মের কয়েকটি উদাহরণ দেওয়া হল।

$rules = array( 
    'picture'   => "/picture/(?'text'[^/]+)/(?'id'\d+)",    // '/picture/some-text/51'
    'album'     => "/album/(?'album'[\w\-]+)",              // '/album/album-slug'
    'category'  => "/category/(?'category'[\w\-]+)",        // '/category/category-slug'
    'page'      => "/page/(?'page'about|contact)",          // '/page/about', '/page/contact'
    'post'      => "/(?'post'[\w\-]+)",                     // '/post-slug'
    'home'      => "/"                                      // '/'
);

এরপরে অনুরোধটি ইউরি প্রস্তুত করতে হবে।

$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );

এখন আমাদের ইউরি অনুরোধটি রয়েছে, চূড়ান্ত পদক্ষেপটি হ'ল নিয়মিত প্রকাশের বিধিগুলিতে ইউরি পরীক্ষা করা।

foreach ( $rules as $action => $rule ) {
    if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
        /* now you know the action and parameters so you can 
         * include appropriate template file ( or proceed in some other way )
         */
    }
}

সফল ম্যাচটি হবে, যেহেতু আমরা রেজিজেমে নামযুক্ত সাব-প্যাটার্নগুলি ব্যবহার করি, $paramsপিএইচপি যেমন অ্যারে পূরণ করে তেমন $_GETঅ্যারে পূরণ করে । তবে, ডায়নামিক ইউআরএল ব্যবহার করার সময় $_GETঅ্যারে পরামিতিগুলির কোনও চেক ছাড়াই পপুলেট হয়।

    / ছবি / কিছু + + টেক্সট / 51

    বিন্যাস
    (
        [0] => / ছবি / কিছু পাঠ্য / 51
        [পাঠ্য] => কিছু পাঠ্য
        [1] => কিছু পাঠ্য
        [আইডি] => ৫১
        [2] => 51
    )

    picture.php? টেক্সট কিছু + + পাঠ্য & id = = 51

    বিন্যাস
    (
        [পাঠ্য] => কিছু পাঠ্য
        [আইডি] => ৫১
    )

এই কয়েকটি লাইন কোড এবং নিয়মিত অভিব্যক্তিগুলির প্রাথমিক জ্ঞান একটি শক্ত রাউটিং সিস্টেম তৈরি শুরু করার জন্য যথেষ্ট।

সম্পূর্ণ উত্স

define( 'INCLUDE_DIR', dirname( __FILE__ ) . '/inc/' );

$rules = array( 
    'picture'   => "/picture/(?'text'[^/]+)/(?'id'\d+)",    // '/picture/some-text/51'
    'album'     => "/album/(?'album'[\w\-]+)",              // '/album/album-slug'
    'category'  => "/category/(?'category'[\w\-]+)",        // '/category/category-slug'
    'page'      => "/page/(?'page'about|contact)",          // '/page/about', '/page/contact'
    'post'      => "/(?'post'[\w\-]+)",                     // '/post-slug'
    'home'      => "/"                                      // '/'
);

$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );

foreach ( $rules as $action => $rule ) {
    if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
        /* now you know the action and parameters so you can 
         * include appropriate template file ( or proceed in some other way )
         */
        include( INCLUDE_DIR . $action . '.php' );

        // exit to avoid the 404 message 
        exit();
    }
}

// nothing is found so handle the 404 error
include( INCLUDE_DIR . '404.php' );

2
আপনি প্যারামিটারগুলি কীভাবে পড়বেন? এটি $ post_id = htmlentities ($ _ GET ['post']) দিয়ে কাজ করে না;
অ্যান্ড্রেবুটোন

@ দানিজেল আমার কি একটি সম্পূর্ণ উত্স কোড থাকতে পারে? আমি উপরের কোডটি চেষ্টা করেছিলাম তবে কেবল পাঠ্যই আউটপুট ছিল, CSS এর কোনও প্রভাব নেই। ধন্যবাদ.
4

6

এটি একটি .htaccess ফাইল যা প্রায় সমস্ত সূচক.এফপিতে ফরোয়ার্ড করে

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_URI} !-l
RewriteCond %{REQUEST_FILENAME} !\.(ico|css|png|jpg|gif|js)$ [NC]
# otherwise forward it to index.php
RewriteRule . index.php

তারপরে আপনার পক্ষে ars _SERVER ["REQUEST_URI"] কে পার্স করা এবং ছবি.পিএফ বা অন্য যাই হোক না কেন যাত্রা


8
অ্যাপাচি FallbackResourceকয়েকটি বড় সংস্করণ আগে এই নির্দেশিকাটি প্রবর্তন করেছিল , এটি কম পারফরম্যান্স ব্যয়ে এই আচরণটি বাস্তবায়নের পছন্দের উপায়, কারণ এটির পুরো পুনর্লিখন ইঞ্জিনটি আরম্ভ করার দরকার নেই। ডকুমেন্টেশন এখানে । আপনার নিয়মাবলীও ত্রুটিযুক্ত কারণ আপনি ডিরেক্টরিগুলি ( !-d) নির্দেশনাটি উল্লেখ করেন না এবং সমস্ত এক্সটেনশন ফিল্টারগুলি অপ্রচলিত - -fইতিমধ্যে সেগুলি ধরা উচিত।
নীলস কেওরেন্টজেস 21


2

যদিও ইতিমধ্যে উত্তর দেওয়া হয়েছে, এবং লেখকের অভিপ্রায়টি একটি ফ্রন্ট কন্ট্রোলার টাইপ অ্যাপ্লিকেশন তৈরি করা তবে আমি জিজ্ঞাসা করা সমস্যার আক্ষরিক নিয়ম পোস্ট করছি। যদি কারও জন্য সমস্যা হয়।

RewriteEngine On
RewriteRule ^([^/]+)/([^/]+)/([\d]+)$ $1?id=$3 [L]

উপরে ইউআরএল জন্য কাজ করা উচিত picture.php/Some-text-goes-here/51। পুনর্নির্দেশ অ্যাপ্লিকেশন হিসাবে index.php ব্যবহার না করে।


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