我想了解使用.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实现这一目标?我是否遇到了潜在的循环?
答案 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
链接。