为什么不在url重写中使用点("。")?

时间:2015-04-30 21:11:18

标签: php mod-rewrite url-rewriting php-standalone-server

我注意到大多数PHP框架路由(全部)都没有使用写入的urls点,而php-standalone-server也没有使用点(注意php-standalone-server不需要mod_rewrite,它通常可以工作)。这是一种模式,我避免重写网址?

考虑在阅读以下主题之前:

  1. 如果我在此struct文件夹中运行php-standalone-server

    project
    │   index.php
    │   test.php
    │
    └── blog1
        └── index.html
    

    访问http://localhost:8000/test.php,它会显示./test.php文件的回复。如果我访问http://localhost:8000/blog1,则会显示blog1/index.html中的内容。这是因为这就是phpstand如何为重写URL提供原生支持,但这不是问题。

    但如果我访问http://localhost:8000/blog,则会显示./index.php的回复。

  2. 自己的stackoverflow是一个用连字符替换点的示例,例如这个问题:

    • 标题:Why not use the dot (“.”) in url rewrite?
    • 网址:http://stackoverflow.com/questions/29977809/why-not-use-the-dot-in-url-rewrite
  3. php框架的一个例子是CodeIgniter-3,不允许点。

  4. 问题:

    理解这一点,我想知道我是否应该在中允许点("。")?不要使用点是标准"?

1 个答案:

答案 0 :(得分:2)

当我搜索(谷歌搜索)术语 rfc dot path

时,终于找到了这个“论战”的原因

网址

中点.的问题

可以在网址中使用点(甚至是网址重写),例如:

http://example/project/hello-new-world

或假设我们将创建一个网址false

http://example/project/index.php/hello-new-world.html

出现的问题是何时使用:

http://example/project/test./

对服务器/project/test.//project/test/是相同的,但是可见的不是。

  

请注意,如果执行此操作/project/.test/,则不会出现此问题,因为有些文件仅以点开头,例如.htaccess

重写URL的原因是不使用点来阻止这种情况或促进URL的规范化(URL规范化)。

更清楚的问题示例,在localhost上的物理文件夹上创建一个文件:

/var/www/images/test.jpg

转到http: //localhost/images/test.jpg,然后尝试访问所有这些:

  • http://localhost/images/test.jpg.
  • http://localhost/images/test.jpg...
  • http://localhost/images/test.jpg....
  • http://localhost/images/test.jpg.....
  • http://localhost/images/test.jpg......
  • http://localhost/images/test.jpg.......

所有网址都以图片test.jpg的形式发送到客户端(例如网络浏览器)。

URL规范化(或URL规范化)

URL(或URL规范化)的规范化是以一致的方式更改和标准化URL的过程。标准化过程的目标是将URL转换为standard URL或规范,以便您可以确定两个不同的URL在语法上是否相同。

搜索引擎使用标准化网址,以便重视网页并减少重复网页的索引。抓取工具执行规范化网址,以避免多次跟踪同一资源。

标准化的类型(以下标准化由RFC 3986描述):

  • 删除目录索引。 URL中通常不需要默认目录索引:

    http://www.example.com/a/index.htmlhttp://www.example.com/a/

  • 更换IP域名。验证IP地址是否映射到规范域名:

    http://208.77.188.166/http://www.example.com/(帮助它的是标题Host: domain

  • 删除包含两个相邻条形的重复切割路径可以转换为:

    http://www.example.com/foo//bar.htmlhttp://www.example.com/foo/bar.html

  • 删除或添加www作为第一个域名标签。这两个网址经常点到同一页面:

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

  • 查询为空时删除?。当查询为空时,可能不需要?

    http://www.example.com/display?http://www.example.com/display

  • /添加到目录:

    http://www.example.com/alicehttp://www.example.com/alice/(通常,Apache和Nginx的服务器已经进行了重定向,如果是真正的文件夹)。

    但是,无法知道URL路径组件是否是目录。 RFC 3986请注意,如果网址重定向到上一个网址示例,则表明它们是等效的。

  • 删除分段点(点分段)。细分...可以根据RFC 3986中描述的算法从网址中删除它:

    http://www.example.com/../a/b/../c/./d.htmlhttp://www.example.com/a/c/d.html

    但是,如果删除了..组件,例如b/..是具有不同父级的目录的符号链接,省略b/..将导致不同的路径和URL。在极少数情况下,取决于Web服务器,对于根目录甚至可能是这样(例如//www.example.com/..可能不等同于//www.example.com/(这可能是避免{{1}的原因}})

然后你问我:我必须避免重写网址中的点?

我说这是一个解决方案,但不是唯一的,如果你使用.可能是通过示例使用像PHP这样的语言,通过这种语言你可以检测到URL是否在末尾有点,例如:

mod_rewrite

<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([a-zA-Z0-9\-\/.]+)$ index.php/$1 [QSA,L] </IfModule> 生成变量RewriteRule,您可以将变量与变量$_SERVER['PATH_INFO']进行比较,两者都会有所不同。或者您可以使用$_SERVER['REQUEST_URI']REQUEST_URI结合来检查并进行永久重定向,例如:

rtrim

来源: