2016-08-01 6 views
0

controller/foo.xtnのようなルートを処理しようとするたびに、YiiはUnable to determine the path info of the current request.と訴えます。 xtnをアクションパラメータ、つまりactionFoo($xtn)に変換してcontroller/foo?type=xtnに変換することで、これらのルートを処理したいと考えています。私の計画は、この動作を定義するためにUrlRuleを書くことですが、パス情報解析の失敗を回避するにはどうすればよいですか?ファイルのようなURLルートの解析を許可する

私はenablePrettyUrlを使用していますが、enableStrictParsingとしたいと思いますが、今のところそれを扱うことはできません。

編集:どのような動作し、どのようなことはしません -

controller/foo/abc?type=xtn ---> actionFoo('abc', 'xtn') # works 
controller/foo/abc/xtn ---> actionFoo('abc', 'xtn') # works 
controller/foo/abc.xtn ---> actionFoo('abc', 'xtn') # doesn't work 

エラーがcontroller/foo/abc.xtnを解析しようとしたときにgetPathInfo()によってスローされるので、WebサーバでのYii経由でルーティングされています。 (今のPHP内部Webサーバを使用して)

ルーティングの設定:上記の設定を使用して

<?php 
// www/routing.php 
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) { 
    return false; 
} else { 
    include __DIR__ . '/../web/index.php'; 
} 

は、私はPHPサーバがYiiのが読んでいるものですREQUEST_URI変数を設定します見ることができます。

'REQUEST_URI' => '/controller/foo/abc.xtn?app=4' 

私はこれがウェブサーバーの問題ではないと思います。ここでの$ _SERVER配列における唯一の大きな違いです:あなたはYiiののsource codeを読めば

# fails in getPathInfo() 
'REQUEST_URI' => '/feeds/strings/en.json?app=4', 
'SCRIPT_NAME' => '/feeds/strings/en.json', 
'SCRIPT_FILENAME' => '/Users/darvids0n/NetBeansProjects/php-web-services/web/www/routing.php', 
'PHP_SELF' => '/feeds/strings/en.json', 

# works 
'REQUEST_URI' => '/feeds/strings/en?app=4', 
'SCRIPT_NAME' => '/index.php', 
'SCRIPT_FILENAME' => '/Users/darvids0n/NetBeansProjects/php-web-services/web/index.php', 
'PATH_INFO' => '/feeds/strings/en', 
'PHP_SELF' => '/index.php/feeds/strings/en', 

、しかし、あなたはPATH_INFOの欠如は、実際に「決定パス情報」に失敗に考慮しないことがわかります。

答えて

2

不明なパスは404で終わるはずです。リダイレクトするのは難しいかもしれませんが、ループに陥らないように注意する必要があります。あなたは「最後の手段」のパスになりますあなたのリストの最後のルールを追加することができます

'<controller>/<action>' => '<controller>/<action>', 

のようなものの任意のコントローラとアクションがここに動作します。

ファイル拡張子については、ルールにsuffixパラメータを使用できます。

[ 
    'pattern' => 'posts', 
    'route' => 'post/index', 
    'suffix' => '.json', 
], 

あなたがアクションに拡張子を渡したい場合、私は一つのパラメータ名に固執するでしょう:

'controller/foo/<type:\w+>' => 'controller/foo' 

だからあなたのようなアクションが必要です。

public function actionFoo($type) 
+0

ない私は確かにこれがどのように役立つかについてあなたに従ってください。私のURLルールにかかわらず、リクエストをルーティングするための予備ステップの1つは、['getPathInfo()'](https://github.com/yiisoft/yii2/blob/master/framework/web/UrlManager.php# L237)。ルールの反復処理を開始する前に例外がスローされます。 – darvids0n

+0

この場合、サーバー構成に問題があります。それはApacheですか?もしそうなら、ホスト設定を貼り付けることができますか? – Bizley

+0

貼り付けられたルーティング設定とその他のいくつかのもの。 – darvids0n

0
// controller (site) 
public function actionFoo($type) 
// rule 
'site/foo<type:(\.xtn)>' => 'site/foo', //site/foo.xtn 
'site/foo/<type:(\.xtn)>' => 'site/foo' //site/foo/xtn 
+0

これは既に試みましたが、同じパス情報エラーが発生します。 – darvids0n

+0

答えが出る前に、私はそれを確認しました。おそらく競合していますが、このルールを1位に入れてください。 Yiiバージョン:2.0.9。また、Webサーバが 'xtn'を' php'として扱っているかどうか確認してください。 – cetver

+0

同じYiiバージョン。私はこれをテストするためにPHPの内部Webサーバを使用していますが、ブラウザにYiiエラーが表示され、 'index.php'を通してすべてを解決していることを除いて、問題がある可能性があります。 – darvids0n

関連する問題