web-dev-qa-db-ja.com

スペースを含むURLのApacheRewriteMapが機能しない

実際、vhost内でRewriteMapディレクティブを使用して、800のURLのリストをリダイレクトしています。静かに動作します:

RewriteEngine On
RewriteMap redirects dbm=db:/data/apps/project/current/configuration/etc/httpd/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

マッピングを含むredirect.txtファイルを使用します。次に、dbファイルに変換されます。

httxt2dbm -f db -i /data/apps/project/current/configuration/etc/httpd/conf/redirects.txt -o /data/apps/project/current/configuration/etc/httpd/conf/redirects.db

たとえば、この種のURLの場合は問題ありません。

/associations/old_index.php /

ただし、URLにスペースが含まれていると、機能しません:(他の特殊文字と同じになると思います)

/Universités%20direct   /

このケースをどのように処理しますか?

4
COil

回避策として、spaceを含むURLをハイフンに内部的に書き換え(スペースをハイフンに置き換える)、ハイフネーションされたURLを書き換えマップに含めることができます。代わりに。

URL内に単一のスペースを含むURLがいくつかある場合は、既存のディレクティブの前に次のディレクティブのようなものを使用できます。

RewriteRule ^(.+)\s(.+)$ $1-$2

そして、リライトマップで以下を使用します。

/Universités-direct /

PDATE: 2つのスペースを含むURLがある場合(例:/the force awakens)そして1つのスペースを持つものは、追加のルールを追加できます。

RewriteRule ^(.+)\s(.+)\s(.+)$ $1-$2
RewriteRule ^(.+)\s(.+)$ $1-$2

これらのルールは、スペースで終わるURLがないことを前提としています。また、連続するスペースが複数あるURLはありません。

3つのスペースがある場合は、上記の前に別のルールを追加します...

RewriteRule ^(.+)\s(.+)\s(.+)\s(.+)$ $1-$2

特に必要な場合を除いて、一般的な「すべてを1つのルールに変換する」のではなく、複数の(単純な)ルールを使用してこれを行う傾向があります。一般的なルールは再帰的に実行され、複数のスペースを1文字に減らします。また、Apacheの既知の書き換えバグを防ぐために、追加のフラグ(DPIなど)が必要になる可能性があります。

1
MrWhite

2番目の書き換えマップを使用できます。内部関数「エスケープ」により、スペースが%20に変わります。

RewriteMap ec int:escape

RewriteMap redirects dbm=db:/data/apps/project/current/configuration/etc/httpd/conf/redirects.db

RewriteCond ${redirects:${ec:$1}} !=""

RewriteRule ^(.*)$ ${redirects:${ec:$1}} [redirect=permanent,last]

次に、独自のリライトマップデータベースで次のことができます。

/Universités-direct%20/

これは一致するはずです。

4
Chris Lawton

これを解決するには、%{THE_REQUEST}変数からエンコードされたURIを抽出し、それを使用してルックアップを実行します。もちろん、エンコードされたURIをマップに配置する必要があります。次のようなもの:

 RewriteEngine On 
 RewriteMapはdbm = db:/data/apps/project/current/configuration/etc/httpd/conf/redirects.db 
 RewriteCond%{THE_REQUEST} "\をリダイレクトしますw +([^] +) "
 RewriteRule ^-[E = MYVAR:%1] 
 
 RewriteCond $ {redirects:%{ENV:MYVAR}}!=" " [。

私はそれをDBの代わりにテキストベースのマップでのみテストしました。クエリ文字列でURLを処理する必要がある場合は、おそらくこれを変更する必要があります。

3
Unbeliever