我注意到许多网站,即使是完善的网站,在处理网址的方式上也有所不同。
Stack Overflow: http://stackoverflow.com/questions/tagged/url+php
Google: https://www.google.com/search?q=url+handling
Facebook: http://www.facebook.com/userID
Normal PHP: http://example.com/page.php?param=1&other=2
Wordpress可以轻松地在不同的URL结构之间进行更改。
我的第一个问题很简单:您如何改变网站处理网址的方式?我认为你必须设置一些htaccess
重写,但我不确定。
此外,在使用/
传递参数的网站上,这些网站如何访问某个文件夹?我通常使用http://example.com/includes来访问我的includes
文件夹,但如果我使用/
传递参数,我的网站将如何知道我想要做什么?
我的第二个问题更为重要:为什么网站会更改其网址结构?它背后的理由是什么?它只是独一无二的吗?性能怎么样?哪一个是服务器上最轻的?或者他们没有真正的区别,公司只是认为某个结构在浏览器URL栏中看起来更好?
答案 0 :(得分:1)
为了更彻底地解决您的问题,我想立即将您的注意力从Web服务器转移到HTTP协议以及它如何从根本上发挥作用。
HTTP是一种非常简单的协议,包含REQUEST-RESPONSE模型。客户端(用户的浏览器基本上)发送所谓的HTTP请求标头,该标头可能有也可能没有非空的HTTP请求主体。当您想要访问https://stackoverflow.com/questions/tagged/url+php
等网址时,标题看起来像这样GET /questions/tagged/url+php HTTP/1.1
Host: stackoverflow.com
Connection: keep-alive
请注意,在HTTP请求标头的第1行,您的浏览器为了发送到stackoverflow服务器,整个行由3个非常简单的部分组成。
此请求的第二行为服务器提供客户端打算通过此请求访问的主机名。
现在,在服务器端,一旦您的Web服务器收到此实际请求,它就可以选择处理该请求,但它很高兴。但是,您在任何常见的apache / nginx / lighttpd Web服务器设置中可能习惯的行为是,客户端提供的路径必须与文档根目录中的物理路径匹配。这远非真相。这只是Web服务器处理请求的一种方式。您可以选择告诉您的Web服务器以不同的方式处理每个请求。
作为示例,Apache的httpd Web服务器提供mod_rewrite,它可以告诉您的Web服务器重写请求URI,以便服务器可以根据特定规则(如正则表达式或给定的条件集)将它们重定向到其他位置。
<Directory />
Options -Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>
以上是一个非常简单的例子,说明WordPress的重写规则通常会为你提供一个.htaccess文件,除了我从我的虚拟主机文件中获取它,这通常比使用.htaccess快得多。在决定使用.htaccess之前,请务必先考虑将.htaccess放入apache.conf的vhost Directory
指令,因为它们是运行时文件,因此本质上较慢。一般来说,mod_rewrite本身只是很慢,应该永远用作最后的手段。
在任何情况下,所有这些重写内容都会重定向任何进入您的网络服务器的请求,该请求会在该vhosts'DocumentRoot
的根目录下重定向到您的index.php文件,然后该文件在内部处理请求确定该请求应包含哪些PHP脚本以及如何呈现页面。
这只是穷人的做法。它通常被称为前端控制器或前端路由器。它只是作为请求URI和我们将处理为任何给定请求URI呈现响应的实际方式之间的中间人。
如果你是stackoverflow或谷歌,你会有更高级别的反向代理(负载均衡器)处理这些请求,并与数据中心的其他服务器联系,然后处理基于该请求URI呈现请求。
请记住,我们所做的只是访问客户端 HTTP请求标头的GET /questions/tagged/url+php HTTP/1.1
部分,并将其发送到另一个知道如何响应它的脚本或程序。就像你的网络服务器可以为你做的那样。
答案 1 :(得分:0)
对于您的第一个问题,您网站中的某些文件夹不会向用户显示。示例一些媒体文件。您将在.htaccess
文件
下面的代码将隐藏目录列表。如果用户将浏览器指向没有索引文件的目录,那么在这种情况下403错误将是
Options -Indexes
如果要显示目录,请使用
Options +Indexes
第二个问题 - 通常人们使用网址重写是因为SEO
友好网址。
在搜索时它出现在前面..
例如,您有产品详细信息页面,并且您在查询字符串中传递产品ID。重写将使用斜杠将查询字符串更改为正确的URL。这对谷歌查找搜索结果非常有用。
RewriteEngine On
RewriteRule ^products/([a-zA-Z]+)/([0-9]+)/$ index.php?product=$1&price=$2
以下链接可以为您提供帮助。