2

在我现在正在处理的网站上,我需要设置一个重定向以消除查询字符串,但需要对某些参数(如“ver”、“dir”、“load”等)进行例外处理。

例如

  • www.myweb.com/?ver=3.5&load=min&dir=ltr这样就可以了。

  • www.myweb.com/?id=123这将重定向到 www.myweb.com。

我有以下代码重定向每个查询字符串,除了 js 和 css

    RewriteEngine on

    # redirect to same URI, but without query string
    RewriteCond %{QUERY_STRING} .
    RewriteRule ^ %{REQUEST_URI}? [R=301]

    # except .js and .css
    RewriteRule ^(.*)\.(?!js|css)([^.]*)$ $1\.php [L]

这消除了所有查询字符串,如何添加参数异常?

谢谢

4

1 回答 1

0

我认为没有一种简单的方法可以删除所有查询字符串参数,除了通过 htaccess 和正则表达式的 ver/load/dir 的任何变体。

如果你有类似的东西:

www.myweb.com/?q=q&a=a& ver=3.5 &z=z&w=w& load=min &x=x& dir=ltr &c=c&d=d

很难仅提取任意数量的 ver/load/dir 参数:

www.myweb.com/?ver=3.5&load=min&dir=ltr

你最好做这样的事情:

# remove all params if no ver/dir/load
RewriteCond %{QUERY_STRING} !^$
RewriteCond %{QUERY_STRING} !(ver|dir|load)=[^&]+
RewriteRule ^(.*)$ /$1? [L,R=301]

# query string isn't only ver/dir/load params, cleanse them with a php script:
RewriteCond %{QUERY_STRING} !^(&?(ver|dir|load)=[^&]+)+$
RewriteCond %{REQUEST_URI} !qs-clean\.php
RewriteRule ^(.*)$ /qs-clean.php?page=$1 [L,QSA]

然后在qs-clean.php脚本中,你会有类似的东西:

<?php

$qs="";

if(isset($_GET['load']))
   $qs=$qs . '&load=' . $_GET['load'];

if(isset($_GET['ver']))
   $qs=$qs . '&ver=' . $_GET['ver'];

if(isset($_GET['dir']))
   $qs=$qs . '&dir=' . $_GET['dir'];



header("HTTP/1.1 301 Moved");
header('Location: /' . $_GET['page'] . '?' . substr($qs,1));

?>

所以它会做重定向并只打印出你关心的参数。


如果在查询字符串中出现ver/dir/load 参数时只是不删除查询字符串,则可以使用mod_rewrite 来完成。这是在另一种情况下进行的重定向:

# remove all params if no ver/dir/load
RewriteCond %{QUERY_STRING} !^$
RewriteCond %{QUERY_STRING} !(ver|dir|load)=[^&]+
RewriteRule ^(.*)$ /$1? [L,R=301]
于 2013-09-20T03:59:43.910 回答