如何使用htaccess将多个查询字符串展平为url

时间:2014-10-05 19:01:37

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

我问了this问题并得到了一个很好的答案,只是因为我仍然不明白这是怎么回事。也许有人可以解释这个过程以及每个旗帜的作用。

所以现在我有,

site.com/index.php?query1=this&query2=that&query3=those and i want this translated into

site.com/song/this/that/those

这是现有的代码。

Options -Indexes +FollowSymLinks
RewriteEngine On
DirectoryIndex index.php
#/////////////append www before all urls///////////////////////////
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301]
RewriteCond %{THE_REQUEST} \ /+index\.php\?u=([^&\ ]+)
RewriteRule ^ /%1? [L,R=301]
#/////////////song
#///////////////////remove index.php from url/////////////
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)index\.php($|\ )
RewriteRule ^ /%1 [R=301,L]
#////////////Convert 'u' Query String////////////
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ index.php?u=$1 [L]

1 个答案:

答案 0 :(得分:0)

您需要再添加2条规则来处理3个查询字符串(如果您还要处理2个查询字符串,则需要再添加4条规则)。

检查%{THE_REQUEST}的规则查看HTTP请求中的URL,并与查询字符串(u=([^&\ ]+))匹配并重定向浏览器,以便在浏览器中显示新URL&# 39; s位置栏。集合中的第二个规则将请求返回重写为具有查询字符串,因为您的资源位于index.php

所以你要添加(在RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301]规则下):

RewriteCond %{THE_REQUEST} \ /+index\.php\?query1=([^&]+)&query2=([^&]+)&query3=([^&\ ]+)
RewriteRule ^ /%1/%2/%3? [L,R=301]
RewriteCond %{THE_REQUEST} \ /+index\.php\?query1=([^&]+)&query2=([^&\ ]+)
RewriteRule ^ /%1/%2? [L,R=301]

重定向浏览器。

然后在内部重写请求,将这些规则添加到最后:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ index.php?query1=$1&query2=$2&query3=$3 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)$ index.php?query1=$1&query2=$2 [L,QSA]