1

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

使用 RewriteRule 我可以得到它,这样你就可以输入一个干净的 URl 并进入正确的页面,但我遇到的问题是如果使用“凌乱”的 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/login

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

当地址中可能有多达 3 个或更多查询时,我无法弄清楚如何让它理清那种 URL。我不完全胜任正则表达式,所以我尝试修改我的代码片段到目前为止失败了。

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

编辑

在玩了几个小时的正则表达式之后,我进步了,但又被难住了。

如果我对此表示:

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

它将匹配 index.php 之后的这 3 个 URL:

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///

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

4

1 回答 1

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 的末尾,其中#是适当的递增反向引用。

于 2013-01-29T00:47:59.677 回答