2

私が現在取り組んでいる Web サイトでは、クエリ文字列を排除するリダイレクトを設定する必要がありますが、「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 に答える