htaccess 重写和重定向 SEO 友好的 URL
Posted
技术标签:
【中文标题】htaccess 重写和重定向 SEO 友好的 URL【英文标题】:htaccess rewrite and redirection for SEO friendly URLs 【发布时间】:2019-06-07 01:42:59 【问题描述】:我知道这个问题过去可能重复或回答过,但我已经阅读了 apache.org 网站并看到了许多其他类似的答案,但由于我是新手,所以到目前为止我找不到合适的解决方案。 .htaccess 和 apache。
为简单起见,我们假设我网站的 URL 是:https://www.example.com
主页是index.php
,有一个提交表单,其中包含三个名称:sp
、ar
和in
。 sp
是强制性的(用户必须输入一个值),ar
和 in
是可选的。
当我提交表单时,文件results.php
被执行。当所有 3 个下拉列表都有值时,提交的 URL 的形式为:
1) https://www.example.com/results.php?sp=textvalue1&ar=textvalue2&in=textvalue3
此外,根据ar
和in
是否有(或没有)值,URL 的其他可能形式是:
2) https://www.example.com/results.php?sp=textvalue1&ar=&in=
3) https://www.example.com/results.php?sp=textvalue1&ar=textvalue2&in=
4) https://www.example.com/results.php?sp=textvalue1&ar=&in=textvalue3
我想将这些“丑陋”的 URL 转换为对 SEO 友好的 URL。
对于案例 1(所有 3 个下拉菜单都有值),我想提交表单并在浏览器的 URL 字段中查看:
(case 1) https://www.example.com/textvalue1/textvalue2/textvalue3
并获得相同的结果(重要)!
同样,我希望其他对 SEO 友好的 URL:
(case 2) https://www.example.com/textvalue1
(case 3) https://www.example.com/textvalue1/textvalue2
(case 4) https://www.example.com/textvalue1/textvalue3
我的猜测是我必须做两件事:首先,将丑陋的 URL 转换为 SEO 友好的 URL,其次,将新的 SEO 友好的 URL 视为旧的丑陋 URL。
到目前为止,我已经在我的 .htaccess
文件中为案例 2 尝试了以下命令,但没有任何反应:
Options +FollowSymlinks -Indexes -MultiViews
RewriteEngine On
RewriteCond %THE_REQUEST \s/results\.php\?sp=([a-zA-Z]+)\s [NC]
RewriteRule ^ /%1? [R=302,L]
RewriteRule ^/([[a-zA-Z]]+)$ /results.php?sp=$1 [L]
【问题讨论】:
这行不通。当然,您可以为此实现重定向和重写规则。但是,据我所知,您无法确定像https://www.example.com/foo/bar
这样的 URL 实际上试图表达什么:bar
的价值是什么? ar
或 in
?
但是如何使用多个/不同的条件和规则,每种情况一个?
当然,如果你可以命名条件来区分这两种含义,那么你可以实现它们。但是你没有在你的问题中说出任何名字。那么它们是什么?
你的回答让我有点困惑。据我所知,不需要命名条件,只需使用正确的正则表达式值来决定在哪里应用 RewriteRule。
问题不在于您是否可以应用规则。你完全正确,你只需要一个匹配的正则表达式。我在这里指出的问题是:如果我在第一条评论中提到的示例 URL 有一个匹配的正则表达式,那么你会将哪个 GET 参数分配给你在传入请求中捕获的值 bar
?您会将其分配给ar
还是in
?这在您的问题中没有以任何方式定义,我不能为此提供任何逻辑。再说一遍:你能说出一个条件或逻辑来决定 URL 的实际含义吗?
【参考方案1】:
正如问题 cmets 中已经讨论的那样,我看到关于重写逻辑的问题存在问题。您要求针对所有三个请求参数都存在的情况展示一种更简化的方法。这是一个建议,它也处理仅指定两个参数的情况。你甚至不需要条件,匹配模式对于这样的逻辑就足够了:
RewriteEngine on
RewriteCond %REQUEST !-f
RewriteCond %REQUEST !-d
RewriteRule ^/?([^/]+)/([^/]+)/([^/]+)$ /results.php?sp=$1&ar=$2&in=$3 [END]
RewriteRule ^/?([^/]+)/([^/]+)$ /results.php?sp=$1&ar=$2 [END]
RewriteCond $QUERY_STRING ^sp=(.+)&ar=(.+)&in=(.+)$
RewriteRule ^/results\.php$ /%1/%2/%3 [R=301,END]
RewriteCond $QUERY_STRING ^sp=(.+)&ar=(.+)$
RewriteRule ^/results\.php$ /%1/%2 [R=301,END]
该规则集同样适用于 http 服务器主机配置以及动态配置文件(“.htaccess”样式文件)。这里的一般性说明:您应该始终喜欢将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些动态配置文件增加了复杂性,通常是导致意外行为的原因,难以调试,而且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)的情况下作为最后一个选项提供。
如果您在使用上述规则集时遇到“内部服务器错误”(http 状态 500),那么您很可能操作的是非常旧版本的 apache http 服务器。在这种情况下,将 END
标志替换为 L
标志。在这种情况下,您将在 http 服务器错误日志文件中找到有关不受支持的 END 标志的特定提示。
再一次:如果你可以命名一个逻辑来决定哪个请求参数分配第二个规则捕获的第二个值,如果它被应用,然后它可以实现这样的条件并处理您最初提到的所有三种情况。但是如果没有你指定这样的逻辑,就不可能实现某些东西。
【讨论】:
我使用了除最后一行之外的所有代码行。我在浏览器的 URL 字段中写了example.com/value1/value2/value3,它为我获取了正确的结果,但 URL 仍然“丑陋”(example.com?sp=value1&ar=value2&in=value3)。我们已经完成了一半...... 我必须道歉,你是绝对正确的。我调整了答案并添加了反向规则集。请再试一次。 似乎有效!你是男人!我猜现在结果页面中出现的一些损坏的图像需要绝对路径而不是相对路径,对吧? 最后一个问题:当我输入example.com/value1/value2/value3 时,页面具有所需的行为。但是当我提交页面时,网址仍然很难看(example.com?sp=value1&ar=value2&in=value3)。奇怪的。你知道为什么会这样吗? 如果图像在重写之前工作,那么您不需要更改它们的引用方式。更有可能上面的重写逻辑也适用于它们。请记住,无论请求什么,重写规则都会重写与模式/.../.../...
匹配的 所有 请求。所以最好是添加另一个条件来防止在这种情况下重写。同样,您需要命名一个条件。也许图像有一个共同的文件夹,它们保存在里面?你需要告诉我们...以上是关于htaccess 重写和重定向 SEO 友好的 URL的主要内容,如果未能解决你的问题,请参考以下文章
301 通过 .htaccess 将查询字符串重定向到 SEO 友好的 URL
Yii2 301 从原始 url 重定向到 .htaccess 中对 SEO 友好的 url 不起作用,需要其他解决方案