如何读取请求URI?
How to read the request URI?
对于我自己的 MVC,我需要从全局变量($_GET
或 $_SERVER
)中读取请求 URI。
首先我想从 $_GET
数组中读取它。但后来我发现它也包含在 $_SERVER
数组中。
那么请问,请求URI应该从哪个全局数组中读取?
例子:
URI 可以具有以下结构:
http://local.mvc/PsrTest/testRequest/123?var=someval
与:
PsrTest
作为控制器名称;
testRequest
作为动作名称;
123
作为控制器操作的参数;
var=someval
as some query string key/value pair;
通过在“.htaccess”中应用 RewriteRule
,它将被翻译成:
http://local.mvc/index.php?url=PsrTest/testRequest/123&var=someval
并将保存在$_GET
和$_SERVER
数组的以下项中:
------------
$_GET array:
------------
'url' => 'PsrTest/testRequest/123'
'var' => 'someval'
---------------
$_SERVER array:
---------------
'HTTP_REFERER' => 'http://local.mvc/PsrTest/testRequest/123?var=someval'
'REDIRECT_QUERY_STRING' => 'url=PsrTest%2ftestRequest%2f123&var=someval'
'REDIRECT_URL' => '/PsrTest/testRequest/123'
'QUERY_STRING' => 'url=PsrTest%2ftestRequest%2f123&var=someval'
'REQUEST_URI' => '/PsrTest/testRequest/123?var=someval'
感谢您的宝贵时间!
但如果您想使用 .htaccess,这是一个开始。
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
# One param
RewriteRule ^/?([^/]*)$ index.php?section= [NC,L]
# Two params
# IE: search/12345
RewriteRule ^edituser/([a-zA-Z0-9]+)/?$ index.php?section=edituser&id= [NC,L]
# Three params
# IE: search/12345/676767
RewriteRule ^editcontact/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/?$ index.php?section=editcontact&contactID=&reservationID= [NC,L]
这是我编写的旧程序中的一个小示例。
正如@teresko 所建议的,.htaccess
并不总是可行的。那么在 .htaccess
中编写 RewriteRule
s 确实没有意义(至少对我而言),它将给定的 URI 转换为查询字符串参数。足以:
- 写一个简单的规则,比如
RewriteRule ^ index.php [L]
in .htaccess
;
- 只需解析PHP中的
$_SERVER['REQUEST_URI']
值,即可获取调用控制器动作所需的URI组件,并将相应的参数传递给它。
感谢所有帮助我找到答案的用户。谢谢!
对于我自己的 MVC,我需要从全局变量($_GET
或 $_SERVER
)中读取请求 URI。
首先我想从 $_GET
数组中读取它。但后来我发现它也包含在 $_SERVER
数组中。
那么请问,请求URI应该从哪个全局数组中读取?
例子:
URI 可以具有以下结构:
http://local.mvc/PsrTest/testRequest/123?var=someval
与:
PsrTest
作为控制器名称;testRequest
作为动作名称;123
作为控制器操作的参数;var=someval
as some query string key/value pair;
通过在“.htaccess”中应用 RewriteRule
,它将被翻译成:
http://local.mvc/index.php?url=PsrTest/testRequest/123&var=someval
并将保存在$_GET
和$_SERVER
数组的以下项中:
------------
$_GET array:
------------
'url' => 'PsrTest/testRequest/123'
'var' => 'someval'
---------------
$_SERVER array:
---------------
'HTTP_REFERER' => 'http://local.mvc/PsrTest/testRequest/123?var=someval'
'REDIRECT_QUERY_STRING' => 'url=PsrTest%2ftestRequest%2f123&var=someval'
'REDIRECT_URL' => '/PsrTest/testRequest/123'
'QUERY_STRING' => 'url=PsrTest%2ftestRequest%2f123&var=someval'
'REQUEST_URI' => '/PsrTest/testRequest/123?var=someval'
感谢您的宝贵时间!
但如果您想使用 .htaccess,这是一个开始。
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
# One param
RewriteRule ^/?([^/]*)$ index.php?section= [NC,L]
# Two params
# IE: search/12345
RewriteRule ^edituser/([a-zA-Z0-9]+)/?$ index.php?section=edituser&id= [NC,L]
# Three params
# IE: search/12345/676767
RewriteRule ^editcontact/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/?$ index.php?section=editcontact&contactID=&reservationID= [NC,L]
这是我编写的旧程序中的一个小示例。
正如@teresko 所建议的,.htaccess
并不总是可行的。那么在 .htaccess
中编写 RewriteRule
s 确实没有意义(至少对我而言),它将给定的 URI 转换为查询字符串参数。足以:
- 写一个简单的规则,比如
RewriteRule ^ index.php [L]
in.htaccess
; - 只需解析PHP中的
$_SERVER['REQUEST_URI']
值,即可获取调用控制器动作所需的URI组件,并将相应的参数传递给它。
感谢所有帮助我找到答案的用户。谢谢!