1

domain.com/application/controller/action/parameterN/valueNユーザーが入力するとき、またはサイト内の直接リンクでこのような URL を使用しています。

しかし、私が実装AJAXするとき、フォームデータをサーバーに送信するときに使用する必要があるかもしれないことは知っています。jQuery<form>query string

しかし、私が実装した方法では、htaccessクエリfront controller文字列を使用して検出できません。私に何ができる?クエリ文字列を読み取る方法を実装するか、JavaScript で関数を作成して、クエリ文字列を美しい URL に変換しますか? どうすればそれを行うことができますか?

私の .htaccess ファイル:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?key=$1 [L]

私のphpファイル:

<?php
    class System{
        private $_url;
        private $_explode;
        public $_controller;
        public $_action;
        public $_params;

        public function  __construct(){
            $this->setUrl();
            $this->setExplode();
            $this->setController();
            $this->setAction();
            $this->setParams();
        }

        private function setUrl(){
            $_GET['url'] = (isset($_GET['url']) ? $_GET['url'] : 'index/index_action');
            $this->_url = $_GET['url'] .'/' ;
        }

        private function setExplode(){
            $this->_explode = explode( '/' , $this->_url );
        }

        private function setController(){
            $this->_controller = $this->_explode[0];
        }

        private function setAction(){
            $ac = (!isset($this->_explode[1]) || $this->_explode[1] == null || $this->_explode[1] == 'index' ? 'index_action' : $this->_explode[1]);
            $this->_action = $ac;
        }

        private function setParams(){
            unset( $this->_explode[0], $this->_explode[1] );
            array_pop( $this->_explode );

            if ( end( $this->_explode ) == null )
                array_pop( $this->_explode );

            $i = 0;
            if( !empty ($this->_explode) ){
                foreach ( $this->_explode as $val ){
                    if ( $i % 2 == 0 ){
                        $ind[] = $val;
                    }else{
                        $value[] = $val;
                    }
                    $i++;
                }
            }else{
                $ind = array();
                $value = array();
            }
            if( count($ind) == count($value) && !empty($ind) && !empty($value) )
                $this->_params = array_combine($ind, $value);
            else
                $this->_params = array();
        }

        public function getParam( $name = null ){
            if ( $name != null )
                return $this->_params[$name];
            else
                return $this->_params;
        }

        public function run(){
            $controller_path = CONTROLLERS . $this->_controller . 'Controller.php';
            if( !file_exists( $controller_path ) )
                die('Houve um erro. O controller nao existe.');

            require_once( $controller_path );
            $app = new $this->_controller();

                if( !method_exists($app, $this->_action) )
                    die('Esta action nao existe.');

            $action = $this->_action;
            $app->$action();
        }
    }
4

1 に答える 1

1

ここで QSA フラグが必要です。

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?key=$1 [L,QSA]

QSA (Query String Append) フラグは、既存のクエリ文字列を保持しながら、書き換えルールを介して新しいクエリ パラメータを追加します。

参考:Apache mod_rewrite の紹介

于 2013-11-07T15:40:59.663 に答える