6

現在、Mod Rewrite Regex が動作しています。

RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)?((?:cmd)[^/]*)/((?!(?:cmd)[.+]*)(.+)) $1?$2=$3&%1 [L]

この正規表現は次の URL を受け取り、すぐ下の URL に変換します。

www.site.com/cmd1/param/cmd2/param2/stillparam2そしてそれをwww.site.com/index.php?cmd1=param&cmd2=param2/stillparam2

これで問題なく動作しますが、別の否定先読みアサーションを作成して、URL ブロック (/texthere/パラメーター) にアンダースコアが含まれないようにしたいと考えています。無効な文字列は次のようになりますwww.test.com/cmd/thing/getparam_valuehere。正規表現はcmd/thingをキーと値のペアとして解析し、残りの文字列を無視する必要があります。次に、別の RewriteRule を作成して、アンダースコアを含む URL のブロックを別の URL パラメーターとして追加します。次の URL 変換が行われます。

www.test.com/cmd/param1/cmd2/directory/param2/sortorder_5
www.test.com?cmd=param1&cmd2=directory/param2&sortorder=5

十分に明確でない場合はお知らせください。どんな助けでも素晴らしいでしょう。

NB: 既に存在するものの中にネストされた否定的な先読みを使用(?!(?!))しようとしましたが、2 つの否定的な先読みを使用しようとしました|が、どちらの解決策も機能しませんでした。もっと根本的に間違っているのではないかと思いました。

皆さんありがとう。

編集:次のことも試しました-これは本当にうまくいくと思いました(しかし、明らかにうまくいきませんでした!)

RewriteRule ^(.*/)?((?:cmd)[^/]*)/((?!(?:cmd)[.+]*)(?![.+]*(?:_)[.+]*)(.+)) $1?$2=$3&%1 [L]

これにより、次のことが行われます。

www.test.com/cmd/param1/sortorder_1/に変換します www.test.com?cmd=param1/sortorder_1/

代わりに次のようになる場合: www.test.com?cmd=param1&sortorder=2/. /sortorder_2/変換するルール&sortorder=2はまだ作成されていませんが、私の言いたいことがわかると思います)。

4

2 に答える 2

1

約 4 日間の試行錯誤の末、当初の予想とは少し異なる解決策にたどり着きました。index.php ファイルへの実際の URL 操作をすべて削除し、すべてのリクエストをそこにルーティングしました。これが私の(よりきれいな).htaccessファイルです:

Options +FollowSymlinks
RewriteEngine On
RewriteCond %{QUERY_STRING} (.*)
RewriteRule (.*) index.php?path=$1 [QSA,L]

入力した URL を解析するために使用したコード ブロックは次のとおりです。

preg_match_all('|/([A-Za-z0-9]+) ((?!/)[A-Za-z0-9- .]*)|', $_GET['path'], $matches) ;

        // Remove all '$_GET' parameters from the actual $_GET superglobal:
        foreach($matches[0] as $k => $v) {
            $search = '/' . substr($v, 1);
            $_GET['path'] = str_replace($search, '', $_GET['path'], $count);
        }

        // Add $_GET params to URL args
        for ($i = 0; $i < count($matches[1]); $i++) {
            self::$get_arguments[$matches[1][$i]] = $matches[2][$i];
        }

        // Retrieve all 'cmd' properties from the URL and create an array with them:
        preg_match_all('~(cmd[0-9]*)/(.+?)(?=(?:cmd)|(?:\z))~', $_GET['path'], $matches);

        if (isset($matches[1][0])) {
            return self::$url_arguments = array_combine($matches[1], $matches[2]);

次のような URL で:

http://localhost/frame_with_cms/frame/www/cmd/one/cmd2/two/cmd3/three/cmd4/four/getparam_valuepart1_valuepart2/cmd5/five/

これらの個別の配列を正常に生成し、それを使用してリクエストを処理します。

Array
(
    [getparam] => valuepart1_valuepart2
)
Array
(
    [cmd] => one/
    [cmd2] => two/
    [cmd3] => three/
    [cmd4] => four/
    [cmd5] => five/
)

時間を割いて読んで返信してくれたすべての人に感謝します。

于 2011-07-23T00:36:57.417 に答える
0

作業ルールを維持し、現在のルールの前に param_value をクエリ文字列に書き換える方が簡単ではないでしょうか?

何かのようなもの

RewriteRule ^(.*)?/([^_/]+)_([^/]+)/ $1/?$2=$3 [N,QSA]

すべての /param_value/ 部分を param=value としてクエリ文字列に追加する必要があります。

N フラグの使用に注意してください。無限ループに陥る可能性があります。

于 2011-07-20T09:55:26.273 に答える