我问了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]
答案 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]