एक मॉड्यूल कैसे पता लगा सकता है जब "पहुंच अस्वीकृत" पृष्ठ आउटपुट है?


16

एक मॉड्यूल के लिए यह पता लगाना कैसे संभव है कि जब ड्रुपल "एक्सेस इनकार" पृष्ठ का उत्पादन कर रहा है।
मुझे पता है कि इसे ड्रुपल 6 के साथ कैसे करना है; मुझे यह जानने की ज़रूरत है कि इसे ड्रुपल 7 के साथ कैसे करना है।

जवाबों:


13

आप सेट कर सकते हैं कि 403 और 404 त्रुटियां होने पर कौन से पृष्ठ प्रदर्शित होते हैं (व्यवस्थापक / सेटिंग्स / त्रुटि-रिपोर्टिंग)।

मुझे लगता है कि आप अपने में एक नया पृष्ठ जोड़ सकते हैं hook_menu(), फिर इस पृष्ठ को 403 त्रुटि कॉलबैक के रूप में सेट कर सकते हैं । जब आपका कस्टम मेनू कॉलबैक हिट होता है, तो आप जानते हैं कि आप "पहुंच अस्वीकृत" पृष्ठ का उत्पादन कर रहे हैं!


यह मेरे लिए एक अच्छा समाधान नहीं है क्योंकि यह 403 का पता लगाकर न केवल आउटपुट में बदलाव कर रहा है।
फैबियन क्वात्रावाक्स

12

मैं इसे Boost 7.x में करता हूं। यह सुंदर नहीं है, लेकिन यह काम पूरा करता है।

function boost_page_delivery_callback_alter(&$callback, $set = FALSE) {
  if ($callback == 'drupal_deliver_html_page') {
    $callback = 'boost_deliver_html_page';
  }
}

function boost_deliver_html_page($page_callback_result) {
  global $_boost;

  // Menu status constants are integers; page content is a string or array.
  if (is_int($page_callback_result)) {
    // @todo: Break these up into separate functions?
    switch ($page_callback_result) {

      // …

      case MENU_ACCESS_DENIED:
        // 403 page.
        $_boost['menu_item']['status'] = 403;
        break;

      // …

    }
    // …
  }
  // …   
}

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

10

Drupal 7 में, पहले से ही सेट किए गए HTTP हेडर को वापस करने वाला फ़ंक्शन drupal_get_http_header () है , जिसमें पैरामीटर के रूप में HTTP हेडर नाम की आवश्यकता होती है। को देखते हुए authorize_access_denied_page () , और drupal_fast_404 () कोड स्पष्ट है कि कार्य करने के लिए पारित करने के लिए महत्व देता है बनाता है।

  // authorize_access_denied_page()
  drupal_add_http_header('Status', '403 Forbidden');
  watchdog('access denied', 'authorize.php', NULL, WATCHDOG_WARNING);
  drupal_set_title('Access denied');
  return t('You are not allowed to access this page.');
// drupal_fast_404()
if ($fast_paths && preg_match($fast_paths, $_GET['q'])) {
  drupal_add_http_header('Status', '404 Not Found');
  $fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>');
  // Replace @path in the variable with the page path.
  print strtr($fast_404_html, array('@path' => check_plain(request_uri())));
  exit;
}

जब "स्थिति" हेडर 403 से शुरू होता है , तो Drupal आउटपुट एक एक्सेस अस्वीकृत पृष्ठ होता है।

सुनिश्चित करें कि कॉल drupal_get_http_header('Status')देर से होती है। के दौरान कॉल hook_init()करना बहुत जल्द होता है, लेकिन इसे hook_page_alter()(या किसी भी विषय प्रीप्रोसेस हुक के दौरान ) कॉल करने से अद्यतन हेडर की जानकारी होगी।


यह वास्तव में अच्छा जवाब है। हालाँकि नोट करने के लिए केवल एक बिंदु: यह केवल तभी काम करता है जब पृष्ठ कैश न हो। यदि पृष्ठ पहले ही पहुँचा जा चुका है, तो drupal_get_http_header('Status')रिटर्न NULL
फेबियन क्वात्रावाक्स

4

आपका मॉड्यूल " Default 403 (access denied) page" जो पृष्ठ द्वारा संशोधित किया गया है " " के मान को रोक सकता है Administer > Site configuration > Error reporting:

  1. में hook_enable, variable_get/ का उपयोग करके variable_set, मौजूदा मूल्य को एक द्वितीयक चर में कॉपी करें और चर को अपने स्वयं के पथ (जिसे आपने उपयोग करके पंजीकृत किया है hook_menu) से प्रतिस्थापित करें

  2. hook_form_FORM_ID_alterद्वितीयक चर से पढ़ने / लिखने के लिए उपयोग करते हुए "त्रुटि रिपोर्टिंग" फ़ॉर्म को बदल दें

  3. यदि आप उपयोगकर्ता के लिए पूरी तरह से अदृश्य होना चाहते हैं, तो आपका पेज कॉलबैक कॉल कर सकता है drupal_goto( the_value_of_the_secondary_variable )

  4. में hook_disable, द्वितीयक चर से मान को पुनर्स्थापित करें


और यह तब होता है, जब "एक्सेस अस्वीकृत" ट्रिगर होने पर आपका मॉड्यूल एक साफ तरीके से (और उपयोगकर्ता के लिए अदृश्य) हो जाता है।


2

निश्चित रूप से आप PHP के get_headers()फ़ंक्शन का उपयोग कर सकते हैं ?

http://php.net/manual/en/function.get-headers.php

सरणी में पहला तत्व प्रतिक्रिया कोड होगा। यदि इसमें '403' शामिल है तो ड्रुपल ने "एक्सेस अस्वीकृत" पृष्ठ लौटा दिया।

मुझे यकीन नहीं है कि यह कॉल करने के लिए सबसे अच्छी जगह कहां होगी। शायद hook_exit(), आपकी आवश्यकताओं के आधार पर:

http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_exit/6


2

Drupal 7 में Access Denied (403) और Page Not Found (404) का पता लगाने का यह सबसे सरल तरीका है।

// get the menu router item for the current page
$router_item = menu_get_item();

// if there is no router item, this page is not found
$is_page_not_found_404 = empty($router_item);

// if 'access' is empty for the router item, access is denied
$is_access_denied_403 = empty($router_item['access']);

-2

इसके लिए आप पैनल्स मॉड्यूल का उपयोग कर सकते हैं ।

पैनल्स मॉड्यूल एक साइट व्यवस्थापक को कई उपयोगों के लिए अनुकूलित लेआउट बनाने की अनुमति देता है। इसके मूल में यह एक ड्रैग एंड ड्रॉप कंटेंट मैनेजर है जो आपको एक लेआउट के अंदर नेत्रहीन रूप से एक लेआउट और जगह की सामग्री डिजाइन करने देता है। अन्य प्रणालियों के साथ एकीकरण आपको नोड्स बनाने की अनुमति देता है जो इस का उपयोग करते हैं, लैंडिंग पेज जो इस का उपयोग करते हैं, और यहां तक ​​कि सिस्टम पेज जैसे कि टैक्सोनॉमी और नोड पेज को भी ओवरराइड करते हैं ताकि आप अपनी साइट के लेआउट को बहुत महीन दाने वाली अनुमतियों के साथ अनुकूलित कर सकें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.