了解重定向和重写.htaccess之间的区别

时间:2012-09-13 04:39:19

标签: apache .htaccess mod-rewrite

我想了解使用.htaccess重定向和重写URL之间的区别。 所以这是一个例子:假设我有www.abc.com/ index.php?page=product_types&cat=88之类的链接(称之为“原始”网址)

但是当用户键入abc.com/shoes时(让我们将其称为“所需的”网址),他们需要查看上述链接的内容。要做到这一点,我会这样做:

Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule ^(.*)shoes(.*)$ index.php?page=product_types&cat=88

这段代码没有错,它可以解决问题。但是,如果我在地址栏中输入原始网址,则会显示内容,但网址不会更改。所以它仍然是www.abc.com/index.php?page=product_types&cat=88

但是,如果我输入/shoes,我希望所需的网址(www.abc.com/ index.php?page=product_types&cat=88)显示在地址栏中怎么办?如何使用.htaccess实现这一目标?我是否遇到了潜在的循环?

1 个答案:

答案 0 :(得分:29)

有些解释可以在这里找到:https://stackoverflow.com/a/11711948/851273

要点是重写只发生在服务器上,客户端(浏览器)对此视而不见。浏览器发送请求并获取内容,服务器上发生的事情并不是更明智的。

重定向是对请求的服务器响应,它告诉客户端(浏览器)提交新请求。浏览器要求输入网址,此网址是位置栏中的内容,服务器获取该请求,使用重定向进行响应,浏览器获取响应并在服务器的响应中加载URL。位置栏中的URL现在是新URL,浏览器会发送新URL请求。

简单地在服务器上内部重写对于野外的URL完全没有任何意义。如果google或reddit或其他任何网站都有www.abc.com/index.php?page=product_types&cat=88的链接,那么您的内部服务器重写规则对此没有任何影响,也不会对点击该链接的任何人或任何因任何原因请求该URL的客户端做任何事情。 。所有重写规则都在内部更改服务器中包含shoes/index.php?page=product_types&cat=88的内容。

如果您想要使用所有查询字符串对index.php页面发出请求,您可以告诉客户端(浏览器)重定向到更好看的URL。你需要小心,因为重写规则循环,你的重定向将在内部重写,这将导致重定向,将在内部重写等。导致循环,并将抛出500服务器错误。因此,您可以专门匹配请求本身:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\?page=product_types&cat=88
RewriteRule ^/?index.php$ /shoes [L,R=301]

这应该仅用于制作它,以便野外链接指向正确的位置。 您必须确保您的内容生成正确的链接。这意味着您网站上的所有内容都使用/shoes链接,而不是/index.php?page=product_types&cat=88链接。