.htaccess如何强制/自动清理URL

时间:2013-01-28 14:31:44

标签: apache .htaccess mod-rewrite clean-urls

我是mod_rewrite的新手,但我正尽力用干净的网址修复我的网站。

使用RewriteRule我可以得到它,这样你就可以输入一个干净的URl并进入正确的页面,但是我遇到的问题是,如果使用“杂乱的”,它会自动重定向到干净的URL(这是很可能由于用户提交的链接和内容等)

现在,我在另一个.htaccess论坛上找到了这段代码,它可以在一种情况下工作,但不能在另一种情况下工作。我会解释一下:

# FORCE CLEAN URLS
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?(.*)=([^\s]+) [NC]
RewriteRule ^ %1\/%2? [R=301,L]

这样可以在这样的地址上正常工作,例如: www.domain.com/index.php?cmd=login 它会自动重定向到 www.domain.com/cmd/登录

但问题出现时,有多个查询,例如: www.domain.com/index.php?cmd=view-profile&user=bob

在地址中最多可能有3个或更多查询时,我无法弄清楚如何对其进行排序。 我不完全胜任正则表达式,所以我试图修改我的代码片段到目前为止都失败了。

任何帮助将不胜感激!我希望他们成为301重定向,这样无论使用什么类型的干净或凌乱的URL,网站都可以正确索引并符合SEO标准,但我愿意接受建议!

修改

在玩了几个小时的正则表达式之后,我已经取得了进步但又被重击了。

如果我对此表达:

index\.php\?(.*)=([^\s]+)(&(.*)=([^\s]+))?+
$1/$2/$3/$4/$5

它将匹配index.php以后的这3个网址:

  

http://site.com/index.php?cmd=shop&cat=78

     

http://site.com/index.php?cmd=shop

     

http://site.com/index.php?cmd=shop&cat=78&product=68

但结果输出取决于它是什么。这些是我的结果:

  

http://site.com/cmd=shop&cat/78///

     

http://site.com/cmd/shop///

     

http://site.com/cmd=shop&cat=78&product/68///

我不确定如何将某些部分视为可选部分,以便正确分组。

1 个答案:

答案 0 :(得分:1)

您需要分别处理每对参数。您拥有的那个可用于处理一个名称/值对,然后类似地接近2和3(如果需要,则为4):

# To handle a single name/value pair in the query string:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?([^&=]+)=([^&\ ]+)(\ |$) [NC]
RewriteRule ^ /%1\/%2? [R=301,L]

# To handle 2:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?([^&=]+)=([^&\ ]+)&([^&=]+)=([^&\ ]+)(\ |$) [NC]
RewriteRule ^ /%1\/%2/%3/%4? [R=301,L]

# To handle 3:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?([^&=]+)=([^&\ ]+)&([^&=]+)=([^&\ ]+)&([^&=]+)=([^&\ ]+)(\ |$) [NC]
RewriteRule ^ /%1\/%2/%3/%4/%5/%6? [R=301,L]

基本上,您需要在检查请求结束之前添加另一个&([^&=]+)=([^&\ ]+) (\ |$),并在结尾添加另一个/%#/%#目标URI,其中是适当增加的反向引用。