正在用.htaccess中多个参数中的一个参数重写url


Rewriting url with one parameter out of multiple parameters in .htaccess

我在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]

原始URL的代码是:

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

您的问题不太清楚,但您可以使用这样的规则,使您可以从查询字符串中的任何位置捕获所有这些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]

你真的有这样一个来自浏览器的非SEO非SEF URI吗?把它转换成像"/alpe adria/艺术文化"这样的SEF形式有什么意义?除非你的新目录结构实际上是这样设置的,并且你试图将旧的非SEO/SEF URI与新布局相匹配。

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

你说/alpe-adria/是固定的,你有一个"搜索引擎友好"的群组名称(例如"艺术文化")。您想将"艺术文化"映射到index.php的URI中吗?我看不出您从哪里获得传入URI中的grp级别条目。你能做的最好的事情就是拥有大量的查找条目:匹配"艺术文化",输出所需的完整URI。匹配其他内容,输出不同的所需完整URI。