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/ => ''