使用带异常的htaccess查询字符串重定向

时间:2013-09-20 02:54:11

标签: .htaccess redirect mod-rewrite

在我正在处理的网站上,我需要设置一个消除查询字符串的重定向,但需要为某些参数设置例外,例如“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]

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

由于

1 个答案:

答案 0 :(得分:0)

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

如果你有类似的话:

  

www.myweb.com/?q=q&a=a&的版本= 3.5 &安培; Z = Z&安培; W =瓦特&安培;的负载=分钟&安培; 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]