web-dev-qa-db-ja.com

apache-クエリ文字列書き換えルールはURLに条件を追加します

書き直そうとして

site-search.html?searchword=search%20term 

なので

advanced-search#q=search%20term

私はいつもadvanced-search#q=%3Fsearchword%3search%20termで終わります

%3Fsearchword%3の部分は、検索語の直前に生成されたURLに不思議なことに追加されます。

私が実施しているルールは次のようになります。

RewriteCond %{REQUEST_URI}  ^/site-search\.html$
RewriteCond %{QUERY_STRING} ^searchword=(.*)$
RewriteRule ^(.*)$ http://www.example.com/advanced-search#q=%1 [R=301,L,NE]

「q =」の後に何を置いても違いはないことは言及する価値があります。関係なく、同じエラーまたはtoのわずかな変化が発生します。

1
manchine

RewriteRuleの%1は、同じRewriteRule(。*)の条件から取得され、そこでクエリ文字列をURI自体と照合します。

解決策1:2番目のRewriteCondのパターンをRewriteRuleの条件に移動またはコピーします。

コメントと、何に到達したいのかという仮定に基づいて、どういうわけか次のようになります。

RewriteCond %{HTTP_Host} ^(www\.)?domain.com$
RewriteCond %{REQUEST_URI}  ^/site-search\.html$
RewriteRule [?&]searchword=([^&]*) http://www.domain.com/advanced-search#q=%1 [R=301,L,NE]

解決策2:RewriteRuleの[QSA]フラグを調べます。これにより、クエリ文字列全体が結果のuriに追加されます。 (Apache 2.2用ではありません)

1
asdmin

一致するようにパッテンを微調整し、?を追加した後ターゲットURLに対して、構文は最終的に意図したとおりに機能します。

RewriteCond %{REQUEST_URI}  ^/site-search\.html$
RewriteCond %{QUERY_STRING} ^searchword=([^&]+)
RewriteRule ^([^&]+) http://www.domain.com/advanced-search?#q=%1 [R=301,L,NE]

?ターゲットURLにあると、元のクエリ文字列が再記述されなくなります。 Apache 2.4を実行している場合は、QSDフラグを再配線ルールに渡すことで同じ結果を得ることができます。

また、ターゲットURLに#(フラグメント識別子)が含まれている場合は、必ず?を配置してください。その前に

0
manchine