怎么&为什么站点的URL处理不同?

时间:2013-01-07 03:05:12

标签: php apache .htaccess url url-rewriting

我注意到许多网站,即使是完善的网站,在处理网址的方式上也有所不同。

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栏中看起来更好?

2 个答案:

答案 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个非常简单的部分组成。

  1. 请求动词,通常类似于GET或POST(但也可以是许多其他内容)。这告诉服务器您希望如何处理请求以使其响应。
  2. 请求路径,可以由主机愿意接受的任何路径以及客户端希望提供的任何可选查询字符串组成,通常需要 URL编码
  3. 请求的协议版本。这通常是HTTP / 1.1或HTTP / 1.0。
  4. 此请求的第二行为服务器提供客户端打算通过此请求访问的主机名。

    现在,在服务器端,一旦您的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

请参阅此链接http://viralpatel.net/blogs/htaccess-directory-listing-enable-disable-allow-deny-prevent-htaccess-directory-listing/

第二个问题 - 通常人们使用网址重写是因为SEO友好网址。

在搜索时它出现在前面..

例如,您有产品详细信息页面,并且您在查询字符串中传递产品ID。重写将使用斜杠将查询字符串更改为正确的URL。这对谷歌查找搜索结果非常有用。

RewriteEngine On
RewriteRule ^products/([a-zA-Z]+)/([0-9]+)/$ index.php?product=$1&price=$2

以下链接可以为您提供帮助。

http://zenverse.net/seo-friendly-urls-with-htaccess/

http://httpd.apache.org/docs/2.0/misc/rewriteguide.html