是的,我想我知道如何解决这个问题。
(免责声明:我知道您知道其中的大部分内容,但我将为可能不知道某些问题的其他人解释一切)
使用 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/它将没有任何价值,因为 .htaccess 文件将忽略重写,因为http://web.com/mysubfolder/路径请求 mysubfolder/index.php这实际上存在并被拒绝谢谢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 也有这个新的更短的三元格式,如果你不关心通知,你可以使用它(我愿意)
$path = $_SERVER['PATH_INFO']?:'/';
处理 QUERY_STRING
现在技术上你没有得到一个 URL,它只是它的路径部分,不会包含 query_string,例如在访问时
http://web.com/mysubfolder/index.php/test?param=val
您只会在 $path 变量中获得 '/test',要获取查询字符串,请使用该$_SERVER['QUERY_STRING']
变量
索引.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
另请记住,该变量与and变量$_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抱歉回复晚了:(