htaccess 重写和重定向 SEO 友好的 URL
htaccess rewrite and redirection for SEO friendly URLs
我知道这个问题可能重复或在过去回答过,但我已经阅读了 apache.org 网站并看到了许多其他类似的答案,到目前为止我找不到合适的解决方案,因为我我是 .htaccess 和 apache 的新手。
为简单起见,我们假设我网站的 URL 是:https://www.example.com
主页是 index.php
,有一个包含 3 个 select/dropdowns 元素的提交表单,其名称为: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
我想将这些 "ugly" 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 好像是老丑一样。
到目前为止,我已经在我的 .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= [L]
正如在问题的评论中所讨论的那样,我发现有关重写逻辑的问题存在问题。您要求针对所有三个请求参数都存在的情况展示一种更简化的方法。这是一个建议,它也处理只指定两个参数的情况。你甚至不需要条件,匹配模式足以满足这样的逻辑:
RewriteEngine on
RewriteCond %{REQUEST} !-f
RewriteCond %{REQUEST} !-d
RewriteRule ^/?([^/]+)/([^/]+)/([^/]+)$ /results.php?sp=&ar=&in= [END]
RewriteRule ^/?([^/]+)/([^/]+)$ /results.php?sp=&ar= [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 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则(这是一个明显的安全噩梦)的应用程序的情况下作为最后的选择提供。
如果您在使用上述规则集时遇到 "internal server error"(http 状态 500),那么很可能您操作的是非常旧版本的 apache http 服务器。在这种情况下,将 END
标志替换为 L
标志。在这种情况下,您会在 http 服务器错误日志文件中找到关于不受支持的 END 标志的特定提示。
再一次:if 你可以命名一个逻辑,通过它来决定哪个请求参数分配第二个规则捕获的第二个值,如果它被应用,然后 可以实现这样的条件并处理您最初提到的所有三种情况。但是如果你不指定这样的逻辑,就不可能实现某些东西。
我知道这个问题可能重复或在过去回答过,但我已经阅读了 apache.org 网站并看到了许多其他类似的答案,到目前为止我找不到合适的解决方案,因为我我是 .htaccess 和 apache 的新手。
为简单起见,我们假设我网站的 URL 是:https://www.example.com
主页是 index.php
,有一个包含 3 个 select/dropdowns 元素的提交表单,其名称为: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
我想将这些 "ugly" 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 好像是老丑一样。
到目前为止,我已经在我的 .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= [L]
正如在问题的评论中所讨论的那样,我发现有关重写逻辑的问题存在问题。您要求针对所有三个请求参数都存在的情况展示一种更简化的方法。这是一个建议,它也处理只指定两个参数的情况。你甚至不需要条件,匹配模式足以满足这样的逻辑:
RewriteEngine on
RewriteCond %{REQUEST} !-f
RewriteCond %{REQUEST} !-d
RewriteRule ^/?([^/]+)/([^/]+)/([^/]+)$ /results.php?sp=&ar=&in= [END]
RewriteRule ^/?([^/]+)/([^/]+)$ /results.php?sp=&ar= [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 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则(这是一个明显的安全噩梦)的应用程序的情况下作为最后的选择提供。
如果您在使用上述规则集时遇到 "internal server error"(http 状态 500),那么很可能您操作的是非常旧版本的 apache http 服务器。在这种情况下,将 END
标志替换为 L
标志。在这种情况下,您会在 http 服务器错误日志文件中找到关于不受支持的 END 标志的特定提示。
再一次:if 你可以命名一个逻辑,通过它来决定哪个请求参数分配第二个规则捕获的第二个值,如果它被应用,然后 可以实现这样的条件并处理您最初提到的所有三种情况。但是如果你不指定这样的逻辑,就不可能实现某些东西。