了解重定向和重写 .htaccess 之间的区别
Posted
技术标签:
【中文标题】了解重定向和重写 .htaccess 之间的区别【英文标题】:Understanding difference between redirect and rewrite .htaccess 【发布时间】:2012-09-06 03:24:43 【问题描述】:我想了解使用 .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
但是,如果我希望在我输入 www.abc.com/ index.php?page=product_types&cat=88
的情况下在地址栏中显示所需的 url (/shoes
) 怎么办?这将如何使用 .htaccess 来完成?我是否陷入了潜在的循环?
【问题讨论】:
是的,我会用 PHP 做这个。 .htaccess 理论上可以工作,但如果你多次这样做,管理重定向的顺序以防止循环将变得越来越难。我知道这很痛苦,但可能值得花时间构建您的请求路由以支持应用程序内的漂亮 URL。 我想我明白了@JoeMills。从 SEO 的角度来看,我想知道从应用程序内部重定向原始 url 是否有任何危险? 【参考方案1】:一些解释可以在这里找到:https://***.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
链接。
【讨论】:
完美!正是我要找的!谢谢,@乔恩 我没有看到您链接的其他答案,因为我只是在 .htaccess 标签中搜索已接受的答案Rewrite
是否传递了POST
请求的请求正文?
***.com/questions/68980458/…以上是关于了解重定向和重写 .htaccess 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
.htaccess url 重写用于 ssl https 重定向