1

私は mod_rewrite にかなり慣れていないので、RewriteMap ディレクティブを適切に機能させようとしています。ご利用の参考になれば幸いです。

URL の形式は次のとおりです。

example.com/section.php?xSec=[ID]

したがって、「Apple iPad」であるセクション 201 の URL は次のとおりです。

example.com/section.php?xSec=201

私が望んでいるのは、これを次のように書き直すことです。

example.com/apple-ipads

次の行を使用して、Apache config で RewriteMap txt ファイルを定義しました。

RewriteMap sections txt:/var/www/rewrites/sections.txt

この txt ファイルには、次のものが含まれています。

multifunction-printers 102
inkjet-printers 103
laser-printers 104
apple-ipads 201

.htaccess で次の書き換えルールを試みました。

RewriteRule ^/section.php?xSec=(.*) ${sections:$1}

これは機能しません。RewriteRule に問題があるか、設定ファイルの間違った場所に RewriteMap ディレクティブを配置したと思います。助言がありますか?

前もって感謝します

ダニエル

4

2 に答える 2

1

この書き換えを使用できます:

RewriteRule ^/(.*) /section.php?xSec=${sections:$1|NOTFOUND}

送信されたすべてのリクエストについて:

example.com/apple-ipads

答えが次のものから透過的に表示されるはずです。

example.com/section.php?xSec=201

キーが見つからない場合、答えは次のようになります。

example.com/section.php?xSec=NOTFOUND

ただし、この書き換えは機能しないことを知っておく必要があります。たとえば、ブラウザーでエンコードできるスペースやその他の文字 (àèò...) がある場合です。

于 2012-11-29T10:43:17.107 に答える
0

あなたの地図は逆です。キーは最初にリストする必要があります。

201 apple-ipads

/ をパターンの先頭に含めるべきではないと私は信じています。つまり、ID が数字のみであると仮定すると、より適切なパターンは次のようになります。

RewriteRule  ^section\.php\?xSec=(\d+)$  ${sections:$1}  [nocase]


アップデート

クエリ文字列をgrepする必要がある場所で、uriでhtaccess作業を行う必要がありました。この優れた投稿は大いに役立ちました。前のパターンは機能しません。これは次のことを行う必要があります。

RewriteCond   %{QUERY_STRING}   xSec=(\d+)$   [nocase]
RewriteRule   ^section\.php$   ${sections:%1}?  [nocase,redirect=perm,last]

キーが一致しない (テストされていない) 場合に元のクエリ文字列を使用するようにデフォルト設定する場合:

RewriteCond   %{QUERY_STRING}   xSec=(\d+)$   [nocase]
RewriteRule   ^section\.php$   ${sections:%1?|$0?id=%1}  [nocase,redirect=perm,last]


更新 2

最後の例の構文は、? が原因で間違っています。${} 関数の一致する側の内部。それ以来、次のようなものを使用して独自のルールを更新しました。

# mapped
RewriteCond   %{QUERY_STRING}   xSec=(\d+)$   [nocase]
RewriteCond   ${sections:%1|NOTFOUND}   !NOTFOUND   [nocase]
RewriteRule   ^section\.php$   ${sections:%1}?  [nocase,redirect=perm,last]

この一連のルールを使用すると、マップされた (クエリ) キーを持つ uri のみがリダイレクトされます。

乾杯。

于 2013-03-25T16:24:06.090 に答える