跟踪“正斜杠”在URL中是否有任何意义?

时间:2014-02-09 11:29:37

标签: php apache url mod-rewrite

例如:

http://www.example.com/index.php?arg1=val1&arg2/

?指定GET值的开头,但尾随/对网址有什么意义吗?

我问的原因是因为这是我第一次在我的网站上尝试过,而我所有内部链接到CSS,图像等(这些都是当前目录的相关链接)都没有工作,所以我需要提供完整的路径让他们工作,以防用户键入一个尾随/的网址。

我正在考虑编写重写规则以将index.php/映射到index.php。这有什么问题吗?另外,有没有办法将其概括为将anything.php/映射到anything.php

服务器是Apache 2.4。

2 个答案:

答案 0 :(得分:1)

有些人使用尾部斜杠来表明网址指向(例如)文件夹。

如果要指向文件,请不要使用尾部斜杠。

当有斜杠(指向文件夹时)时,某些服务器会更快。但这取决于实施。

答案 1 :(得分:1)

Laokoon的回答是正确的,但这是关于在URL的"/"部分末尾有"path"(正斜杠),例如:

http://www.example.com/
http://www.example.com/folder/

您在问题中描述的内容是在网址的"/"部分中显示"query"。{/ p>

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"

"/"中有两种可能的尾随"query"

1)如果跟踪"/"跟在"="后面,而中间没有"&",则跟踪"/""value"的{​​{1}}的一部分与"key"相关联的"="

    "?arg1=val1/"            $_GET["arg1"] => 'val1/'
    "?arg1=/"                $_GET["arg1"] => '/'

2)如果"/"跟在"&"(或"?")之后,中间没有"=",那么"/"就是名称的一部分一个"key"。此外,如果"/"位于最后(尾随),那么"value"的{​​{1}}将为空:

"key"

如果跟踪 "?arg1/=val1" $_GET["arg1/"] => 'val1' "?arg1=val1&arg2/=val2" $_GET["arg2/"] => 'val2' "?arg1/" $_GET["arg1/"] => '' "?arg1=val1&arg2/" $_GET["arg2/"] => '' 跟随"/"(或"&"),则跟踪"?" "/"的名称:

"key"

这是 PhpFiddle 示例:querytest2016-0713.php

    "?/"                     $_GET["/"] => ''
    "?arg1=val1&/"           $_GET["/"] => ''

示例输出:
querytest2016-0713.php?arg1=val1&arg2/

<?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?a=111&b=999&c=13579&arg1=901&arg2/=44&argx&whatever/=88&arg3/

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

当然,如果查询字符串是&#34;手动&#34;使用其他一些编码方法在PHP中解析,然后尾随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/ => '' 可能有其他一些含义或目的,或者它可能完全被忽略。