我注意到大多数PHP框架路由(全部)都没有使用写入的urls点,而php-standalone-server也没有使用点(注意php-standalone-server不需要mod_rewrite,它通常可以工作)。这是一种模式,我避免重写网址?
如果我在此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
的回复。
自己的stackoverflow是一个用连字符替换点的示例,例如这个问题:
Why not use the dot (“.”) in url rewrite?
http://stackoverflow.com/questions/29977809/why-not-use-the-dot-in-url-rewrite
php框架的一个例子是CodeIgniter-3,不允许点。
理解这一点,我想知道我是否应该在url-rewriting中允许点("。")?不要使用点是标准"?
答案 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转换为standard URL
或规范,以便您可以确定两个不同的URL在语法上是否相同。
搜索引擎使用标准化网址,以便重视网页并减少重复网页的索引。抓取工具执行规范化网址,以避免多次跟踪同一资源。
标准化的类型(以下标准化由RFC 3986描述):
删除目录索引。 URL中通常不需要默认目录索引:
http://www.example.com/a/index.html
→http://www.example.com/a/
更换IP域名。验证IP地址是否映射到规范域名:
http://208.77.188.166/
→http://www.example.com/
(帮助它的是标题Host: domain
)
删除包含两个相邻条形的重复切割路径可以转换为:
http://www.example.com/foo//bar.html
→http://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/alice
→http://www.example.com/alice/
(通常,Apache和Nginx的服务器已经进行了重定向,如果是真正的文件夹)。
但是,无法知道URL路径组件是否是目录。 RFC 3986请注意,如果网址重定向到上一个网址示例,则表明它们是等效的。
删除分段点(点分段)。细分..
和.
可以根据RFC 3986中描述的算法从网址中删除它:
http://www.example.com/../a/b/../c/./d.html
→http://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
来源: