1

現在、フォームを送信すると、URL は次のようになります。

(「クエリ」は送信されたデータです)

http://mySite.com/index.php?search=query

また

http://mySite.com/?search=query

どうすれば作れますか

http://mySite.com/search?q=query

.htaccess ファイルを編集せずに実行できる場合は、その方法を教えてください。

または、.htaccess を編集する必要がある場合は、送信時にすべてのクエリがそのフォームに URL を持つように追加するルールを教えてください。

4

2 に答える 2

1

この場合、書き換えルールを使用するのではなく、index.phpからリダイレクトすることをお勧めします。書き換えルールにもコストがかかり、ページが読み込まれるたびにチェックされます

index.phpの冒頭:

<?php
if(!empty($_GET["search"]))
{
    header("Location: search?q=".rawurlencode($_GET["search"]));
    exit;
}
?>

Olaf Dietscheがコメントで正当に指摘したように、mod_rewrite は PHP よりも優れているため、問題はindex.php と他のファイルのヒット率が実際にはどのくらいかということです。それが低い場合は、php のアプローチが確実に優れていますが、index.php が 50% 程度の確率でヒットする場合は、書き直したほうがよいかもしれません。

したがって、 mod_rewrite ソリューションも追加します。

RewriteEngine on
RewriteCond %{QUERY_STRING} (?:^|&)search=([^&]+)
RewriteRule ^index.php$ /search?q=%1 [R,L]

RewriteCond実際にsearch=クエリ文字列パラメーターを探し、それが空でないことを確認しますそして、ルールは index.php から/search?q=<query> Note に何かを単純に書き換え%1ます (ルール自体の一致部分からではなく、条件から一致した最初のキャプチャされたサブパターンに一致するために使用されます)。どちらの場合に使用する必要があります$1)。


しかし、本当の問題は、そもそもなぜこの問題に対処しているのかということです。ページで値を送信して検索を行う場合、それはフォームの送信であるため、ハンドラーを直接指すことができ、後でそこにリダイレクトされることはありません。これははるかに効率的です。

<form action="/search" method="get">
<input type="text" name="q">
...

このように、検索フォームから送信されたものはすべてに直接送信され、/search対処するためのリダイレクトは必要ありません。

于 2013-04-17T06:09:13.813 に答える
1

mod_rewrite ソリューションを追加するには。index.phpおよびsearch=クエリ文字列を確認する必要があります

RewriteCond %{QUERY_STRING} search=(.*)
RewriteRule ^index\.php$ /search?q=%1 [R,L]
于 2013-04-17T15:55:32.593 に答える