web-dev-qa-db-ja.com

404リダイレクト後の正しいURL書き換え

実際に表示されているページに応じて404リダイレクトでURLを書き換えることは可能ですか?

たとえば、存在しないURL "/ fzenk"が要求され、デフォルトの404エラーページがフロントページになるように構成した場合、リダイレクト後のアドレスバーのURLはフロントページのURLになります。

グローバルリダイレクトモジュールを試しましたが、機能しませんでした。別のモジュールで404 redirect = URL-rewriteを実行することは可能ですか、それとも新機能をリクエストする必要がありますか?


更新:

それを行うことは可能ですが、404ページのURLを書き換えるのは 悪い考え のようです。

4
B2F

クリステル・アンダーソンの回答のおかげで、私はそれを正しく理解しているようです。

function THEME_preprocess_page(&$variables, $hook) {
   $status = drupal_get_http_header("status");  
   if($status == "404 Not Found") {
      // get the configured 404 error page url :
      $not_found_url = variable_get('site_404');
      unset($_GET['destination']);
      drupal_goto($not_found_url);
   }
}

構成されたデフォルトの404エラーページに従ってURLを書き換えます。多言語変数でも動作します。

5
B2F

すべての_404_リクエストをフロントページにリダイレクトしたい場合、 template_preprocess_page() フックと drupal_get_http_status()を使用できると思います 404を確認するには:

_function THEME_preprocess_page(&$variables, $hook) { 
   $status = drupal_get_http_header("status");  
   if ($status == "404 Not Found") {      
      header("Location: http://exampel.com/");
      drupal_exit();
   }
}  
_
4
Cyclonecode

このスレッドで提案されているメソッドを使用して403リダイレクトを機能させることができなかったため、代わりにカスタムメニューエントリを使用し、パスをネイティブdrupalエラーリダイレクトページに追加し、ボブのおじさん。= o)

/**
 * Implements hook_menu().
 * 
 */
function MYMODULE_menu() {

  $items = array();

  // On the admin/config/system/site-information form, set the 404 and 403 
  // redirects to MYMODULE-custom-error/40x
  $items['MYMODULE-custom-error'] = array(
    'page callback' => 'MYMODULE_custom_error',
    'page arguments' => array(1),
    'access arguments' => array('access content'),
  );

  return $items;
}

/**
 * Utility function to redirect users to the home page on 404 and 403 errors; 
 * note the settings on admin/config/system/site-information
 */
function MYMODULE_custom_error($error) {
  unset($_GET['destination']);
  drupal_goto();
}
1
user17953

Drupal 6の場合、わずかに変更されたコードを次に示します。

function THEME_preprocess_page(&$variables) { 
  $status = drupal_get_headers();
  if(preg_match('/404 Not Found/', $status)) {      
    unset($_GET['destination']);
header("Location: /pagenotfound");
    exit;
  }
}

ここでは、リダイレクトにdrupal_goto()を使用できませんでした。これは無限ループになるためです。

0
Sastha M L