はい、私はそれを修正する方法を知っていると思います。
(免責事項:あなたがこれのほとんどを知っていることは知っていますが、いくつかの落とし穴を知らないかもしれない他の人のためにすべてを説明するつもりです)
PATH_INFO と .htaccess の使用
次のようなパスに移動した場合、phpにはトリックがあります。
http://web.com/mysubfolder/index.php/controller/action
$_SERVER['PATH_INFO']
変数に「/controller/action」を取得します
次に、.htaccess ファイル (または同等のファイル) を取得して、php スクリプトに現在のフォルダーの深さを伝える必要があります。
これを行うには、.htaccess ファイルを「mysubfolder」に入れます。
mysubfolder
.htaccess
index.php
.htaccess には以下が含まれている必要があります。
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule (.*) index.php/$1
(参照としてyii フレームワークのマニュアルを使用しました。また、 html5 ボイラープレートの使用をお勧めします)
基本的に、URL の特定のポイントですべてを index.php にリダイレクトするように設定します。
今あなたが訪問した場合:http://web.com/mysubfolder/index.php/controller/action
これで、正しいパス「/controller/action」を取得できます$_SERVER['PATH_INFO']
http://web.com/mysubfolder/パスが mysubfolder/index.php を要求するため、.htaccess ファイルは書き換えを無視するため、http ://web.com/mysubfolder/ にアクセスしても何の価値もありませんこれは実際に存在し、拒否されます ありがとうございます。RewriteCond %{REQUEST_FILENAME} !-f
これには、この非常に便利な関数を使用できますifsetor
(どこで入手したか覚えていません)。
function ifsetor(&$variable, $default = null) {
return isset($variable)? $variable: $default;
}
存在するかどうかわからない変数への参照を取得し、存在しない場合は通知やエラーをスローせずにデフォルトを提供します。
これを使用して PATH_INFO 変数を安全に取得できます
index.php で
function ifsetor(&$variable, $default = null) {
return isset($variable)? $variable: $default;
}
$path = ifsetor($_SERVER['PATH_INFO'],'/');
var_dump($path);
php 5.4には、通知を気にしない場合に使用できるこの新しい短い3進形式もあります(私は気にします)
$path = $_SERVER['PATH_INFO']?:'/';
QUERY_STRING の処理
技術的には、URL を取得していません。これは単なるパス部分であり、たとえば次の場合に query_string は含まれません。
http://web.com/mysubfolder/index.php/test?param=val
$path 変数で「/test」のみを取得します。クエリ文字列を取得するには、$_SERVER['QUERY_STRING']
変数を使用します
index.php
function ifsetor(&$variable, $default = null) {
return isset($variable)? $variable: $default;
}
$path = ifsetor($_SERVER['PATH_INFO'],'/');
$fullpath = ($_SERVER['QUERY_STRING'])? $path.'?'.$_SERVER['QUERY_STRING']:$path;
var_dump($fullpath);
しかし、それはあなたのニーズに依存するかもしれません
$_SERVER['QUERY_STRING'] 対 $_GET
また、変数は、クエリ文字列から重複したパラメーターを保持するため、変数とは異なることに注意してください。次に例を示します$_SERVER['QUERY_STRING']
。$_GET
$_REQUEST
このページにアクセスする
http://web.com/mysubfolder/controller/action?foo=1&foo=2&foo=3
$_SERVER['QUERY_STRING']
あなたに次のようなものを与えるつもりなら
?foo=1&foo=2&foo=3
変数は次の$_GET
ような配列になります。
array(
'foo'=>'3'
);
.htaccess がない場合
SCRIPT_NAME を有利に使用してみることができます
list($url) = explode('?',$_SERVER['REQUEST_URI']);
list($basepath) = explode('index.php',$_SERVER['SCRIPT_NAME']);
$url = substr($url,strlen($basepath));
あなたが私のようなものを爆破するのが好きなら:)
あなたの場合
Class Route
{
private $_htaccess = TRUE;
private $_suffix = ".jsp";
public function params()
{
$url='';
//nombre del directorio actual del script ejecutandose.
//basename(dirname($_SERVER['SCRIPT_FILENAME']));
if($this->_htaccess !== FALSE):
//no está funcionando bien si está en un subdirectorio web, por ej stynat.dyndns.org/subdir/
// muestra el "subdir" como primer parámetro
list($url) = explode('?',$_SERVER['REQUEST_URI']);
$basepath = dirname($_SERVER['SCRIPT_NAME']);
$basepath = ($basepath==='/')? $basepath: $basepath.'/';
$url = substr($url,strlen($basepath));
else:
if(isset($_SERVER['PATH_INFO'])):
$url = $_SERVER['PATH_INFO'];
$url = preg_replace('|^/|','',$url);
endif;
endif;
$url = explode('/',$url);
var_dump($url);
var_dump($_GET);
}
}
これが役立つことを願っています
PSお返事遅くなってすみません(;_;)