2

クエリ文字列を含む PHP ページがあります。

http://project.dev/?a=b&c=d

ご存じのとおり、$_GETスーパーグローバル配列を使用してクエリ文字列にアクセスできます。

print_r($_GET);
/*
Array
(
    [a] => b
    [c] => d
)
*/

Apache と を使用してクエリ文字列から疑問符を削除したいhtaccessので、ユーザーがこのアドレスで私のウェブサイトを見たとき:

http://project.dev/a=b&c=d

次のアドレスと同じになります。

http://project.dev/?a=b&c=d

$_GETスーパーグローバル配列を使用して、以前と同じようにクエリ文字列にアクセスできます。

いくつかの重要な注意事項:

  1. ユーザーを疑問符のないURL から疑問符のある URL にリダイレクトしたくありません。

  2. このページには と の両方GETPOSTリクエストがあります。

  3. クエリ文字列には、疑問符自体を含めること?できます。たとえば、
    http://project.dev/?a=b&c=d?x=y.

  4. 疑問符の付いたアドレスが必要な場合は、疑問符のないアドレスに自動的にリダイレクトします。たとえば、ユーザーがこのアドレスで私のサイトにアクセスした場合:
    http://project.dev/?a=b&c=d
    ユーザーをこのアドレスにリダイレクトしたい:
    http://project.dev/a=b&c=d

  5. 私のウェブサイトには 1 ページしかありません: index.php. サブフォルダーなし。

でこれを行うにはどうすればよいhtaccessですか?

4

1 に答える 1

1

このページには GET と POST の両方のリクエストがあります。

リダイレクト後にリクエスト本文が含まれないため、これは問題になる可能性があります。そのため、クエリ文字列に GET スタイルのパラメーターを含むリクエストを POST した場合、リダイレクトは POST パラメーターを失います。

必要なルールは、おそらく次のようになります。

# Redirects query string to non-query string

RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /\?([^\ ]+)
RewriteRule ^ /%2? [L,R,NE]

# And back

RewriteCond %{REQUEST_URI} .=.
RewriteRule ^/?(.*)$ /?$1 [L]

301 リダイレクトが必要な場合Rは、最初のルールのフラグを に置き換えR=301ます。NEフラグは、クエリ文字列でエンコードされ?たものが、エンコードされたもの%3Fではなくとして表示されるようにするために必要%です。または、とチェックで置き換えRewriteCond %{REQUEST_URI} .=.てみることもできます。-f-d

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
于 2012-12-11T06:12:44.693 に答える