0

私が使用しているこのルートは、ローカルの MAMP サーバーでは完全に機能しますが、Dreamhost や HostPapa では機能しません。大文字と小文字を区別するだけの問題だと思いましたが、私が知る限り、すべて問題ないようです。

エラーメッセージ

Kohana_HTTP_Exception [ 404 ]: The requested URL panel/asset/warranty/edit was not found on this server.

ルート:

Route::set('panel/asset', '<directory>(/<controller>(/<action>(/<id>)))',
    array(
        'directory' => 'panel/asset',
        'controller' => 'warranty',
    ))
    ->defaults(array(
        'action' => 'edit',
    ));

コントローラ: Controller/Panel/Asset/Warranty.php

class Controller_Panel_Asset_Warranty extends Controller_Site_AdminTemplate

.htaccess

# Turn on URL rewriting
RewriteEngine On
Options -MultiViews
# Installation directory
RewriteBase /

# Protect hidden files from being viewed
<Files .*>
    Order Deny,Allow
    Deny From All
</Files>

SetEnv KOHANA_ENV DEVELOPMENT

# Protect application and system files from being viewed
RewriteRule ^(?:application|modules|system)\b.* index.php/$0 [L]

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Required for dreamhost
RewriteCond $1 !^(index\.php|public|user_guide|robots\.txt)

RewriteRule .* index.php?$0 [PT,L,QSA]

明らかな何かが欠けていますか?ルーティングはいつも私にそのような悲しみを与えます... /イライラ

4

1 に答える 1

1

パラメータをハードコードされた文字列にしたい場合は、それを正規表現配列に入れないでください。値に正規表現機能を実際に使用する場合にのみ、正規表現配列を使用してください。

これは良いでしょう。正規表現配列を使用して、id が数字であることを確認できます。これは、それを使用する正当な理由です。

Route::set('panel/asset', 'panel/asset(/warranty(/<action>(/<id>)))')
    ->defaults(array(
        'directory' => 'panel/asset',
        'controller' => 'warranty',
        'action' => 'edit',
    ));

URI がルートと一致しなかった場合、例外が読み取られます。Kohana_HTTP_Exception [ 404 ]:Unable to find a route to match the URI: panel/asset/warranty/edit.

例外は、Kohana が URIpanel/asset/warranty/editに一致するルートを探していることを示しています。したがって、問題は .htaccess ファイルではなく、アプリケーションのどこかにあるでしょう。

次のコード ブロックを含むメソッドは 2 つだけです。

throw HTTP_Exception::factory(404,
    'The requested URL :uri was not found on this server.',
    array(':uri' => $this->request->uri())
)->request($this->request);

それらのメソッドはRequest_Client_Internal::execute_request()Controller::execute()です。

ある種のデバッグ ステートメントを配置しController/Panel/Asset/Warranty.phpて、それが見つかって実行されるかどうかを確認しましたか? 再生中にファイルが実行されたが、class_exists('Controller_Panel_Asset_Warranty', FALSE) が FALSE を返したためです。あなたの質問からクラス名をコピーし、自分で入力したクラス名を置き換えたところ、突然機能しました。貼り付けを元に戻すと、再び機能しなくなりました。私は手紙を一文字ずつチェックしましたが、編集者は前後にまったく同じことを見せてくれました。

これが絞り込むのに役立つことを願っています。

于 2013-09-12T09:38:48.630 に答える