php यूआई 2 प्रबंधक यूजर में यूआरएल मैनेजर कॉन्फ़िगरेशन




redirect yii2 (3)

मुझे लगता है कि आपको ऐप्लिकेशन से "आलेख / ए" के लिए यूआरएल बनाने में समस्याएं आ जाएंगी।

उचित URL पर 302 रीडायरेक्ट करने के लिए क्यों नहीं htaccess या vhost फ़ाइल का उपयोग करें?

यदि आप urlManager के माध्यम से इसे संभालना चाहते हैं, तो मुझे लगता है कि आप केवल विहित लिंक को पंजीकृत कर सकते हैं

$this->registerLinkTag(['rel' => 'canonical', 'href' => 'article/a']); 

दृश्य में। यहां मोड विवरण: http://www.yiiframework.com/doc-2.0/yii-helpers-baseurl.html#canonical()-detail

मुझे प्रत्येक यूआरएल के अनुसार यूआरएल urlManager अनुभाग में एप कॉन्फ़िगरेशन मिला है:

    'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'enableStrictParsing' => true,
        'rules' => [
            'article-a' => 'article/a', // canonic comes first
            'article-deprecated-a' => 'article/a',
            'article-another-a-is-deprecated' => 'article/a',
            'b-annoucement' => 'announcement/b', // canonic comes first
            'legacy-b-annoncement' => 'announcement/b',
            ...

मार्गों के लिए एसईएफ यूआरएल सरणी के रूप में frontend/config/main.php में संग्रहीत की जाती है, जिसमें प्रति यूआरएल प्रति यूआरएल होता है। दिए गए मार्ग के लिए पहला यूआरएल (यानी /article-a ) विहित है और शेष विरासत URL हैं

यूआरएल के एक समूह के लिए वैमानिक यूआरएल को निर्दिष्ट करने का सबसे स्वाभाविक तरीका क्या है जो समान मार्ग की तरफ इशारा कर रहे हैं? यह या तो rel="canonical" हो सकता है या 301/302 यूनेनल यूआरएल पर रीडायरेक्ट हो सकता है।

कैनोनिकल यूआरएल को अधिमानतः एक जगह पर निर्दिष्ट किया जाना चाहिए जहां मार्ग परिभाषित किया गया था (इस मामले में frontend/config/main.php कॉन्फिगरेशन फाइल)। आवश्यकता यहां यह है कि विहित यूआरएल नियंत्रक के बाहर परिभाषित किया जाना चाहिए, कंट्रोलर को हार्ड-कोडित नहीं किया गया है।


Yii2 आपके नियमों के आधार पर canonical यूआरएल उत्पन्न करने के लिए एक उपकरण प्रदान करता है।

\helpers\Url::canonical()

विचार यह है कि यह आपको 'लेख-ए' के ​​लिए एक यूआरएल प्रदान करेगा।


मुझे यकीन नहीं है कि आपको अपने नियमों का प्रबंधन करने की ज़रूरत है, इसलिए मैं सामान्य उपयोग के मामले में जाउंगा और मैं अपने जवाब को मैं धान मोगन के अनुच्छेद से समझता हूं जो मैं निम्नलिखित उदाहरण के भीतर फिर से शुरू करूँगा और मुझे आशा है यह आपके आवश्यक समाधान को डिजाइन करने में मदद करता है:

आवश्यकता:

एक खोज इंजन को मानते हुए मेरी वेबसाइट में page B जांच करने के लिए रोबोट भेजा गया था और मैं लोगों के साथ page A स्थान पर रहने के लिए ठीक नहीं हूं। तो यह है कि मैं रोबोट के लिए अपने बिंदु को स्पष्ट कर सकता हूं:

  1. page A 301 रीडायरेक्ट करने के लिए मजबूर:

    खोज इंजन को बताएं कि यह पेज स्थायी रूप से पेज ए में ले जाया जाता है। तो कृपया इसे अधिक लोगों को नहीं भेजें। उन्हें ए पेज पर भेजें

  2. page A को एक 302 पुनर्निर्देशित करने पर मजबूर कर रहा है:

    खोज इंजन को यह कह कर कि यह पृष्ठ अस्थायी पृष्ठ पर ले जाया गया है। इसलिए जो कुछ भी आपको लगता है वह उपयुक्त है।

  3. page B ( 200 स्थिति कोड ) खोलने पर page B इंगित करने वाला एक प्रामाणिक लिंक तत्व सम्मिलित करें:

    खोज इंजन को यह कह कर कि यह पृष्ठ ठीक काम कर रहा है, लेकिन यह मुझे एक द्वितीयक पृष्ठ है और मैं इसके बजाय पेज ए के अगले विज़िटर को भेजने का सुझाव दूंगा।

डिज़ाइन:

इसलिए इस आधार पर कि मैं अपने नियमों के विन्यास में एक संभव संरचना को देखूंगा:

'rules' => [
    [
        // by default: 'class' => 'yii\web\UrlRule',
        'pattern' => '/',
        'route' => 'site/index',
    ],
    [
        // the custom class
        'class' => 'app\components\SEOUrlRule',

        'pattern' => 'about',
        'route' => 'site/about',

        'permanents' => [
            'deprecated-about',
            'an-older-deprecated-about'
        ],

        'temporaries' => [
            'under-construction-about',
        ],

        'secondaries' => [
            'about-page-2'
        ]
    ],
    [
        // different route with own action but canonical should be injected
        'class' => 'app\components\SEOUrlRule',
        'pattern' => 'experimental-about',
        'route' => 'whatever/experimental',
        'canonical' => 'about'
    ],
]

इस तरह मैं जितना सरणियों को चेन कर सकता हूं, क्योंकि मुझे येई की डिफॉल्ट क्लास yii \ web \ UrlRule का उपयोग करने की आवश्यकता है, जबकि मेरे एसईओ संबंधित नियंत्रकों के लिए समर्पित मेरे ऐप कॉन्टैक्ट फ़ोल्डर में कस्टम एक हो सकता है I

कोड जाने से पहले, इस तरह से मैं अपनी वेबसाइट के व्यवहार की अपेक्षा करता हूं:

  • आप / के बारे में पृष्ठ पर जाएं, आपको 200 प्रतिक्रिया मिलती है (कोई वैमाणिक जोड़ा नहीं)।
  • आप 301 स्थिति कोड के साथ / के बारे में / के बारे में परित्याग किए गए / अस्वीकृत-संबंधी पृष्ठ पर जाएं।
  • आप 302 स्थिति कोड के साथ / के बारे में / पर पुनर्निर्देशित पृष्ठ के बारे में / के तहत-निर्माण पर जाएं।
  • आप / के बारे में पेज -2 पेज पर जाएं, आपको 200 प्रतिक्रिया मिलती है ( index/about एक्शन के अनुसार )। इस पर एक समान टैग को छोड़कर कोई पुनर्निर्देशन स्वचालित रूप से स्रोत कोड में इंजेक्ट नहीं किया जाता है: <link href="http://my-website/about" rel="canonical">
  • आप / प्रायोगिक-संबंधी पेज पर आपको 200 प्रतिक्रिया मिलती है ( अपनी स्वयं की कार्रवाई whatever/experimental ) परन्तु उस इंजेक्शन से ऊपर समान कैनोनिक टैग के साथ।

कोड:

SEOUrlRule बस \ yii \ web \ UrlRule का विस्तार करेगा और इसके गुणों को परिभाषित करने के लिए अतिरिक्त पैराग्राफ को परिभाषित करेगा, जिसके आधार पर हम एक HTTP रीडायरेक्शन को बाध्य करेंगे या Yii::$app->view को कैनोनिकल लिंक टैग दर्ज करने के बाद parent::parseRequest() कॉल करेंगे। Yii::$app->view :

namespace app\components;

use Yii;

class SEOUrlRule extends \yii\web\UrlRule
{
    public $permanents  = [];
    public $temporaries = [];
    public $secondaries = [];

    public $canonical = null;

    public function parseRequest($manager, $request)
    {
        $pathInfo = $request->getPathInfo();

        if(in_array($pathInfo, $this->permanents)) 
        {
            $request->setPathInfo($this->name);
            Yii::$app->response->redirect($this->name, 301);
        }

        else if(in_array($pathInfo, $this->temporaries)) 
        {
            $request->setPathInfo($this->name);
            Yii::$app->response->redirect($this->name, 302);
        }

        else if($this->canonical or in_array($pathInfo, $this->secondaries)) 
        {
            $route = $this->name;

            if ($this->canonical === null) $request->setPathInfo($route);
            else $route = $this->canonical;

            Yii::$app->view->registerLinkTag([
                'rel' => 'canonical', 
                'href' => Yii::$app->urlManager->createAbsoluteUrl($route)
            ]);
        }

        return parent::parseRequest($manager, $request);
    }
}

और यही वह है जो इसकी जरूरत है। ध्यान दें कि Yii::$app->controller या इसके संबंधित क्रियाएं मार्गों को सुलझाने के इस प्रारंभिक चरण पर उपलब्ध नहीं होंगी क्योंकि यह इस जीवनचक्र आरेख में दिखाया गया है, लेकिन ऐसा लगता है कि Yii::$app->view पहले ही आरंभ किया गया है और आप कस्टम पैरामीटर ( जैसा कि इस उदाहरण में किया जाता है ) सेट करने के लिए अपनी $ params संपत्ति का उपयोग कर सकते हैं जो कि अधिक बदमाश मामलों के लिए उपयोगी हो सकता है, जहां अधिक डेटा साझा किए जाने या अंतिम आउटपुट के लिए पॉपुलेटेड होना चाहिए।





canonical-link