1

したがって、GETフォームによって生成されたURLでmod_rewriteを使用して、これからリダイレクトしようとしています:

index.php?page=trade&stocksymbol=GOOG

これに:

trade/GOOG

私はすでに.htaccessにこの行を持っています(Multiviewsオフになっています):

RewriteRule ^trade$ index.php?page=trade [L]    
RewriteRule ^trade/(.*)$ index.php?page=trade&stocksymbol=$1 [L]

アドレスバーにtrade/GOOG/と手動で入力すると、問題なく動作します。

問題は、コントローラindex.phpがビューtrade.phpとともにヘッダー + フッターをレンダリングし、フォーム自体がtrade.phpにある MVC モデルを使用していることです。フォームを送信してtrade/GOOGに到達させたいのですが、これは GET フォームであるため、代わりにtrade/trade?stocksymbol=GOOGに移動します。

trade.php

<form action="trade" method="get">
    <input type="text" name="stocksymbol" size="10" />
    <input type="submit" value="Search" />
</form>

index.php

if (isset($_GET['page']))
    $page = htmlspecialchars($_GET['page']);
else
    $page = 'index';

switch ($page)
{
    case 'trade':
        if (isset($_GET['stocksymbol']))
        {
            $stocksymbol = htmlspecialchars($_GET['stocksymbol']);
        }
        render('templates/header', array('title' => 'Trade')); //render() is a function that extracts the array elements into variables and spits out the HTML
        render('trade', array('page' => $page, 'stocksymbol' => $stocksymbol));
        render('templates/footer');
        break;
    ...

mod_rewrite を正しく理解しておらず、ロジックに何か問題があるため、ここで初歩的な間違いを犯していることはわかっていますが、まだ指を置くことはできません。可能であれば、シンプルに保つために、Javascript ソリューションの代わりに mod_rewrite のみを使用してこれを解決したいと思います。これが mod_rewrite で可能かどうかを知りたいからです。

編集:

GET リクエストが通っていないことがわかりました。index.phpを見ると$_SERVER['REQUEST_URI']、送信されているリクエストが次のようになっていることがわかりました ( index.phpが の後にものを受け取っていないことを示唆しています)。/trade?stocksymbol=GOOG?

また、Chrome で開発者ツールを有効にすると、実際に毎回 GET 要求があることがわかりますが、 index.phpまたはtrade.phpif (isset($_GET['stocksymbol']))のどちらにあるかに関係なく、falseです。

したがって、mod_rewrite が私の GET リクエストを台無しにしていると思います。

4

2 に答える 2

1

mod_rewrite またはindex.phpでこれを行うことができます。PHP では、リクエストが に対して直接行われたかどうかを確認するだけでよく、/index.php?page=tradeそうであれば、外部にリダイレクトします。コードと実装する場所によって異なりますが、配置できる場所の 1 つはcasefor です'trade'

case 'trade':
    if (isset($_GET['stocksymbol']))
    {
        $stocksymbol = htmlspecialchars($_GET['stocksymbol']);

        // stuff here to redirect browser
        $self_uri = "/index.php?page=trade";
        if (strncmp($_SERVER['REQUEST_URI'], $self_uri, strlen($self_uri)))
        {
            // if the requested URI starts with /index.php?page=trade, redirect
            header('HTTP/1.1 301 Moved Permanently');
            header('Location: /trade/' . $stocksymbol);
            exit();
        }
        // end browser redirect
    }
    render('templates/header', array('title' => 'Trade')); //render() is a function that extracts the array elements into variables and spits out the HTML
    render('trade', array('page' => $page, 'stocksymbol' => $stocksymbol));
    render('templates/footer');
    break;
...

これを行う mod_rewrite の方法は、同じ種類のものです。実際のリクエスト (この場合は URI ではなく、書き換えエンジンがそれを変更するため) が に対して行われたかどうかを確認し/index.php?page=trade、ブラウザをリダイレクトします。

RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /index\.php\?page=trade&stocksymbol=([^&\ ]+)
RewriteRule ^ /trade/%2? [L,R=301]
于 2013-07-10T03:58:03.887 に答える