Php 是否有尾随的“;正斜杠;在URL中有任何意义吗?
例如:Php 是否有尾随的“;正斜杠;在URL中有任何意义吗?,php,apache,url,mod-rewrite,Php,Apache,Url,Mod Rewrite,例如: http://www.example.com/index.php?arg1=val1&arg2/ ?指定GET值的开头,但是后面的/对URL有任何意义吗 我问这个问题的原因是因为这是我第一次在我的网站上尝试它,而且我所有指向CSS、图像等的内部链接(都是指向当前目录的相对链接)都不起作用,所以我需要提供完整的路径,以便在用户键入带有尾随/的URL时让它们起作用 我正在考虑编写一个重写规则,将index.php/映射到index.php。这有什么问题吗?还有,有没有一种方法可以将
http://www.example.com/index.php?arg1=val1&arg2/
?
指定GET值的开头,但是后面的/
对URL有任何意义吗
我问这个问题的原因是因为这是我第一次在我的网站上尝试它,而且我所有指向CSS、图像等的内部链接(都是指向当前目录的相对链接)都不起作用,所以我需要提供完整的路径,以便在用户键入带有尾随/
的URL时让它们起作用
我正在考虑编写一个重写规则,将index.php/
映射到index.php
。这有什么问题吗?还有,有没有一种方法可以将它推广到将anything.php/
映射到anything.php
服务器是Apache2.4。有些人使用斜杠来明确url指向(例如)一个文件夹 当您要指向文件时,不要使用尾随斜杠。
有些服务器在有斜杠(指向文件夹时)时速度更快。但这取决于实现。Laokoon的答案是正确的,但这是关于在URL的
“路径”
部分的末尾有一个尾随的“/”
(正斜杠),如:
http://www.example.com/
http://www.example.com/folder/
您在问题中描述的是,在URL的“查询”
部分有一个尾随“/”
Parts of the URL: "http://www.example.com/index.php?arg1=val1&arg2/"
http Protocol
www.example.com Subdomain.Domain
index.php Path
?arg1=val1&arg2/ Query
在您描述的情况下:“http://www.example.com/index.php?arg1=val1&arg2/“
,尾随的”/“
确实有意义,但可能不是您想象的那样
您已经将问题标记为,因此我将提供一个PHP示例。在其他语言(如“Perl”
)中,它的处理方式可能会有所不同
在“查询”
中,有两种可能出现尾随“/”
:
1) 如果尾随“/”
跟在“=”
后面,中间没有“&
,那么尾随“/”
是与“=”
关联的“键”
的“值”
的一部分:
2) 如果“/”
跟在“&”
(或“?”
)后面,中间没有“=”
,则“/”
是“键”
名称的一部分。此外,如果“/”
位于末尾(尾随),则该“键”
的“值”
将为空:
"?arg1/=val1" $_GET["arg1/"] => 'val1'
"?arg1=val1&arg2/=val2" $_GET["arg2/"] => 'val2'
"?arg1/" $_GET["arg1/"] => ''
"?arg1=val1&arg2/" $_GET["arg2/"] => ''
如果尾随的“/”
紧跟在“&
(或“?”
)之后,则尾随的“/”
是“键”
的名称:
以下是一个phpfidle示例:
http://www.example.com/index.php?arg1=val1&arg2/
示例输出:当然,如果查询字符串是使用其他编码方法在PHP中“手动”解析的,那么后面的
“/”
可能有其他含义或用途,或者可能被完全忽略。这是“技术”含义,虽然不一定是“目录”或“文件”,但URI的不同部分。从功能上讲,它们通常是相同的,除非你有一些时髦的重写规则,这些规则关心后面的斜杠。后面的反斜杠?你怎么能从文件中指向文件夹index.php?args/folder
?我并不是故意使用一个尾随的反斜杠,我是想确保所有有效的用户输入都能正常工作。我正在使用apache2-编辑帖子谢谢。我正在创建我的第一个PHP网站,在nibbler.silktide.com中检查后,测试发现我的URL中在文件名(.PHP)后面有这些斜杠,它说它不好,但我不知道它们到底是怎么存在的,也不知道如何摆脱它们。@Laokoon我知道你不能从文件中指向文件夹,我想这就是你的答案所暗示的。我要问的是,URL上指向文件的尾随反斜杠是否有任何意义,是否可以使用重写规则将其指向原始文件名
"?/" $_GET["/"] => ''
"?arg1=val1&/" $_GET["/"] => ''
<?php
// http://main.xfiddle.com/55edba50/querytrailingslashtest/querytest2016-0713.php
echo "querytest2016-0713.php<br>\n";
echo 'HTTP_HOST ="' . $_SERVER['HTTP_HOST'] . '"' . "<br>\n";
echo 'REQUEST_URI ="' . $_SERVER['REQUEST_URI'] . '"' . "<br>\n";
echo 'QUERY_STRING ="' . $_SERVER['QUERY_STRING'] . '"' . "<br>\n";
echo "<br>\n";
echo "Test using 'parse_url' and 'parse_str':<br>\n";
// $url = "http://www.example.com/index.php?arg1=val1&arg2/";
$url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$qry = parse_url($url, PHP_URL_QUERY);
parse_str($qry);
parse_str($qry, $arr);
echo "url='" . $url . "'<br>\n";
echo "query='" . $qry . "'<br>\n";
foreach ($arr as $key => $value) {
echo $key . " => '" . $value . "'<br>\n";
}
echo "<br>\n";
echo "Test using '\$_GET':<br>\n";
foreach($_GET as $key => $value){
echo $key . " => '" . $value . "'<br />\r\n";
}
?>
querytest2016-0713.php
HTTP_HOST ="main.xfiddle.com"
REQUEST_URI ="/55edba50/querytrailingslashtest/querytest2016-0713.php?arg1=val1&arg2/"
QUERY_STRING ="arg1=val1&arg2/"
Test using 'parse_url' and 'parse_str':
url='http://main.xfiddle.com/55edba50/querytrailingslashtest/ ...
... querytest2016-0713.php?arg1=val1&arg2/'
query='arg1=val1&arg2/'
arg1 => 'val1'
arg2/ => ''
Test using '$_GET':
arg1 => 'val1'
arg2/ => ''
querytest2016-0713.php
HTTP_HOST ="main.xfiddle.com"
REQUEST_URI ="/55edba50/querytrailingslashtest/querytest2016-0713.php?a=111&b=999&c=13579&arg1=901&arg2/=44&argx&whatever/=88&arg3/"
QUERY_STRING ="a=111&b=999&c=13579&arg1=901&arg2/=44&argx&whatever/=88&arg3/"
Test using 'parse_url' and 'parse_str':
url='http://main.xfiddle.com/55edba50/querytrailingslashtest/ ...
... querytest2016-0713.php?a=111&b=999&c=13579&arg1=901&arg2/=44&argx&whatever/=88&arg3/'
query='a=111&b=999&c=13579&arg1=901&arg2/=44&argx&whatever/=88&arg3/'
a => '111'
b => '999'
c => '13579'
arg1 => '901'
arg2/ => '44'
argx => ''
whatever/ => '88'
arg3/ => ''
Test using '$_GET':
a => '111'
b => '999'
c => '13579'
arg1 => '901'
arg2/ => '44'
argx => ''
whatever/ => '88'
arg3/ => ''