我在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
参数d
和box
是固定的,其他参数grp
、grpname
和level
因页而异。我想做的是将这个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。