使用.htaccess中的多个参数中的一个参数重写URL

时间:2013-11-25 13:19:23

标签: php regex apache .htaccess mod-rewrite

我在htaccess文件中有下一行:

RewriteCond %{QUERY_STRING} (^|&)grp=([0-9]+)(&|$)
RewriteCond %{QUERY_STRING} (^|&)level=([0-9]+)(&|$) 
RewriteRule ^alpe-adria/([a-zA-Z0-9_-]+)$ /site/index.php?d=1&box=1&grp=%1&grpname=$1&level=%2 [L]

原始网址包含以下代码:

/site/index.php?d=1&box=1&grp=13&grpname=art-culture&level=1

参数dbox是固定的,其他参数grpgrpnamelevel因页面而异。我想要做的是将此URL重写为以下状态:

/alpe-adria/art-culture

所以问题是,如何挑出grpname参数并使用所有其他参数,其中两个参数不固定。我尝试了两条RewriteCond %{QUERY_STRING}规则但没有成功。想法是挑出两个参数,然后在原始URL中使用它们。另一方面,在原始URL中使用一个参数,如替代URL。再一次,我被困住了,我需要你的宝贵帮助。

整个片段:

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{QUERY_STRING} box=
RewriteRule ^alpe-adria$ /site/index.php [L]

RewriteCond %{QUERY_STRING} d=
RewriteRule ^alpe-adria$ /site/index.php [L]

RewriteCond %{QUERY_STRING} op=
RewriteRule ^alpe-adria$ /site/index.php [L]

RewriteCond %{QUERY_STRING} masterSearch=
RewriteRule ^alpe-adria$ /site/index.php [L]

RewriteCond %{QUERY_STRING} ^$
RewriteRule ^alpe-adria/?$ /site/index.php?box=1&d=3 [L]

RewriteCond %{QUERY_STRING} (?:|.*&)grpname=([^&]*)
RewriteRule ^site/index\.php$ /alpe-adria/%1? [L,R]

2 个答案:

答案 0 :(得分:1)

您的问题不是很清楚,但您可以使用这样的规则,从查询字符串中的任何位置捕获所有这些parameters grp, grpname and level

RewriteEngine on

RewriteCond %{THE_REQUEST} \s/+site/index\.php\?d=1&box=1&grp=([^&]*)&grpname=([^&]*)&level=([^&]*) [NC]
RewriteRule ^ /alpe-adria/%2/%1/%3? [L,NE,R=302]

RewriteRule ^alpe-adria/([^/]+)/([^/]+)/([^/]+)/?$ /site/index.php?d=1&box=1&grp=$2&grpname=$1&level=$3 [L,QSA]

答案 1 :(得分:0)

真的是否有来自浏览器的非SEO非SEF URI?将它转换为像'/ alpe-adria / art-culture'这样的SEF形式有什么意义?除非您的新目录结构实际上是以这种方式设置的,并且您尝试将旧的非SEO / SEF URI与新布局匹配。

假设您确实有传入'/ alpe-adria / *'URI,则不会将原始网址重写为/alpe-adria/art-culture。您正在使用.htaccess将/alpe-adria/art-culture(来自浏览器)重写为PHP和服务器可以消化的原始格式。请使用正确的术语。 .htaccess对出站 URI没有任何作用。

您说/alpe-adria/已修复,并且您拥有'搜索引擎友好'组名称(例如'art-culture')。您想将'art-culture'映射到index.php的URI吗?我无法看到您从传入的URI中获取 grp 级别条目的位置。你能做的最好的事情就是拥有一些查找条目:匹配'art-culture',输出所需的完整URI。匹配其他内容,输出不同的所需完整URI。