34

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

但是当用户输入abc.com/shoes(我们称之为“想要的”url)时,他们需要看到上面链接的内容。为了做到这一点,我会这样做:

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

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

但是,如果我希望输入的 url ( /shoes) 显示在地址栏中,该www.abc.com/ index.php?page=product_types&cat=88怎么办?这将如何使用 .htaccess 来完成?我是否遇到了潜在的循环?

4

1 回答 1

44

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

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

重定向是服务器对请求的响应,它告诉客户端(浏览器)提交新请求。浏览器请求一个 url,这个 url 是位置栏中的内容,服务器获取该请求并以重定向响应,浏览器获取响应并在服务器的响应中加载该 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链接。

于 2012-09-13T05:01:47.890 回答