0

我注意到许多网站,甚至是成熟的网站,在处理 URL 的方式上都不同。

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 结构之间进行更改。

我的第一个问题很简单:你如何改变你的网站处理 URL 的方式?我认为您必须设置某种htaccess重写,但我不确定。

另外,在/用于传递参数的站点上,这些站点如何访问某个文件夹?我通常使用http://example.com/includes来访问我的includes文件夹,但如果我/用来传递参数,我的网站如何知道我要做什么?

我的第二个问题更重要:为什么网站会更改其 URL 结构?其背后的原理是什么?仅仅是为了独一无二吗?性能怎么样……服务器上哪一个最轻?还是它们没有真正的区别,公司只是认为某种结构在浏览器 URL 栏中看起来更好?

4

2 回答 2

1

为了更彻底地解决您的问题,我想暂时将您的注意力从 Web 服务器转移到 HTTP 协议及其基本工作原理上。

HTTP 是一个非常简单的协议,由请求-响应模型组成。客户端(基本上是用户的浏览器)发送所谓的 HTTP 请求标头,该标头可能具有也可能不具有非空 HTTP 请求正文。当您想访问像https://stackoverflow.com/questions/tagged/url+php这样的 URL 时,标题看起来像这样

GET /questions/tagged/url+php HTTP/1.1
Host: stackoverflow.com
Connection: keep-alive

请注意,在您的浏览器为了发送到 stackoverflow 服务器而制定的 HTTP 请求标头的第 1 行上,整行由 3 个非常简单的部分组成。

  1. 请求动词,通常类似于 GET 或 POST(但也可以是许多其他的东西)。这告诉服务器您希望如何处理请求,以便它期望它响应。
  2. 请求路径,可以由主机愿意接受的任何路径加上客户端希望提供的任何可选查询字符串组成,通常需要进行URL编码
  3. 发出请求的协议版本。这通常是 HTTP/1.1 或 HTTP/1.0。

此请求的第二行向服务器提供客户端打算通过此请求访问的主机名。

现在,在服务器端,一旦您的 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 重写规则的一个非常简单的示例,它们通常为您提供一个 in .htaccess 文件,但我是从我的虚拟主机文件中获取的,这通常比使用 .htaccess 快得多。Directory在您决定使用 .htaccess 之前,请务必先考虑将您想要放入 .htaccess 的任何内容放入您的 apache.conf 的 vhost指令中,因为它们是运行时文件,因此本质上比较慢。一般来说, mod_rewrite 本身很慢,只能作为最后的手段使用。

在任何情况下,所有这些重写的东西都会重定向到该虚拟主机根目录上的网络服务器的任何请求,DocumentRoot以重定向到您的 index.php 文件,然后该文件在内部处理该请求以确定它应该包含哪些 PHP 脚本此请求以及页面将如何呈现。

这只是穷人的做法。它通常被称为前端控制器前端路由器。它只是充当请求 URI 和我们处理为任何给定请求 URI 呈现响应的实际方式之间的中间人。

如果您是 stackoverflow 或 google,您将拥有反向代理(基本上是负载平衡器),它们在更高级别处理这些请求,并连接到数据中心中的其他服务器,然后这些服务器将根据该请求 URI 处理请求的呈现。

请记住,我们所做的只是获取GET /questions/tagged/url+php HTTP/1.1客户端的HTTP 请求标头的一部分并将其发送到另一个知道如何响应它的脚本或程序。就像您的网络服务器可以为您做的一样。

于 2013-01-07T03:31:12.910 回答
0

对于您的第一个问题,您网站中的某些文件夹未向用户显示。例如一些媒体文件。您将在.htaccess文件中执行此操作

下面的代码将隐藏目录列表。如果用户将浏览器指向没有索引文件的目录,则在这种情况下将出现 403 错误

Options -Indexes 

如果要显示目录使用

Options +Indexes

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

对于第二个问题 - 通常人们为什么使用 URL Rewrite 是因为SEOURL 友好。

搜索时它出现在前面..

例如,您有产品详细信息页面,并且您在查询字符串中传递产品 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

于 2013-01-07T03:18:25.493 回答