我在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
参数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]
答案 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。