htaccess重写和重定向SEO友好的URL

时间:2019-01-12 09:33:40

标签: apache .htaccess mod-rewrite url-rewriting friendly-url

我知道这个问题过去可能重复或回答过,但是我已经阅读了apache.org网站,并且看到了许多其他类似的答案,并且由于我是新手,所以到目前为止我仍无法找到解决问题的合适方法。 .htaccess和apache。

为简单起见,我们假设我网站的网址为:https://www.example.com

主页为index.php,有一个带有3个选择/下拉元素的提交表单,其名称分别为:sparinsp是强制性的(用户必须输入一个值),arin是可选的。

提交表单时,将执行文件results.php。当所有3个下拉菜单均具有值时,提交的URL的格式为:

1) https://www.example.com/results.php?sp=textvalue1&ar=textvalue2&in=textvalue3

此外,根据arin是否具有(或没有)值,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友好网址为:

(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。

>

到目前为止,我已经在案例2的.htaccess文件中尝试了以下命令,但没有任何反应:

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]

1 个答案:

答案 0 :(得分:1)

正如对该问题的评论中已经讨论的那样,我看到有关重写逻辑的问题。您要求针对所有三个请求参数都存在的情况显示一种更简化的方法。这是一个建议,也可以处理仅指定两个参数的情况。您甚至不需要这些条件,匹配模式足以满足此类逻辑:

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标志上找到特定的提示。

再一次: if 您可以命名一个逻辑,通过该逻辑来决定使用哪个请求参数来分配第二条规则(如果应用了第二条规则)捕获的第二个值,然后然后可以实现这样的条件并处理您最初提到的所有三种情况。但是,如果不指定这种逻辑,就无法实现某些功能。