13

次のように機能する URL 文字列を作成しようとしています。

/app/process/example.com/index.html

言い換えれば、

/app/process/$URL

次に、URLを取得します

$this->uri->segment(3);

もちろん、URL のスラッシュは uri セグメントへのアクセスに問題があるため、先に進んで URL 部分を URL エンコードします。

/app/process/example.com%2Findex.html

..しかし、今は404と言っています...

Not Found

The requested URL /app/process/example.com/index.html was not found on this server. 

スラッシュの URL エンコーディングが CI の URI パーサーを壊しているようです。

この問題を回避するにはどうすればよいですか?

4

4 に答える 4

10

あなたが受け取っているエラーメッセージは、codeigniter からではなく、Web サーバーからのものだと思います。

CodeIgniter を使用せずに Apache2 を使用してこれを複製しました。ファイル index.php を作成し、アクセスしたところ、問題なく動作index.php/a/b/cしました。その後アクセスしようとするとindex.php/a/b/c%2F、Apache から 404 が返されました。

Apache構成に追加して解決しました:

AllowEncodedSlashes On

詳細については、ドキュメントを参照してください

$config['permitted_uri_chars']これを行っても、まだ機能しない場合は、codeigniterをいじる必要があるかもしれません - スラッシュが除外されていることに気付くかもしれません

于 2008-11-22T23:06:19.197 に答える
4

この問題を回避する 1 つの方法は、URI セグメントで渡す URL 変数のスラッシュを、CodeIgniter URI パーサーを壊さないものに置き換えることです。例えば:


$uri = 'example.com/index.html';
$pattern = '"/"';
$new_uri = preg_replace($pattern, '_', $uri);

これにより、すべてのスラッシュがアンダースコアに置き換えられます。スラッシュをエンコードするために行っていることと似ていると確信しています。次に、他のページで値を取得するときに、次のようなものを使用します。


$pattern = '/_/';
$old_uri = preg_replace($pattern, '/', $new_uri);

これにより、すべてのアンダースコアがスラッシュに置き換えられ、古い URI が返されます。もちろん、使用する文字 (この場合はアンダースコア) が、渡す可能性のある URI のいずれにも存在しないことを確認する必要があります (したがって、おそらくアンダースコアをまったく使用したくないでしょう)。

于 2008-12-08T12:05:18.040 に答える
1

CodeIgniter では、URL のパスはコントローラー、コントローラー内の関数、および関数へのパラメーターに対応します。

URL /app/process/example.com/index.html は、app.php コントローラー、内部のプロセス関数、および 2 つのパラメーター example.com と index.html に対応します。

<?php
class App extends Controller {
    function process($a, $b) {
       // at this point $a is "example.com" and $b is "index.html"
    }
}
?>

編集:質問を読み直すと、URL の一部を別の URL として解釈したいようです。これを行うには、可変数の引数を取る関数を作成する必要があります。これを行うには、関数 func_num_args および func_get_arg を次のように使用できます。

<?php
class App extends Controller {
    function process() {
        $url = "";
        for ($i = 0; $i < func_num_args(); $i++) {
            $url .= func_get_arg($i) . "/";
        }

        // $url is now the url in the address
    }
}
?>
于 2008-11-22T21:40:10.790 に答える
0

構成ファイルの allowed_uri_chars インデックスを変更します

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
于 2010-07-23T17:00:40.210 に答える