2017-02-23 17 views
0

私はURLのより大きなバージョンにリダイレクトされる多くの短いURLがあるサイトで作業しています。短いURLはオフラインで配布され、ユーザーは一般的にブラウザのアドレスバーにそのURLと種類を記憶しておくという考えがあります。例: http://www.example.com/abchttp://www.example.com/higher_education/companion/politics/abc.html
にリダイレクトする必要があります。また、いくつかの外部リンクもあります。以下のような:http://www.example.com/googlehttps://www.google.com
EDITにユーザーをリダイレクトします - http://www.example.com/elementary/def.htmlは、しかし、我々は今RewriteMapでこれを達成したいhttp://www.example.com/elementary/xyz.html
にリダイレクトされます別のシナリオがあります。我々はそのために書かれたコードは以下の通りです:httpd.conf内のRewriteMapと.htaccessの競合するRewriteRule

<IfModule rewrite_module> 
RewriteEngine on 
RewriteMap custommap txt:/var/www/vhosts/example.com/httpdocs/map.txt 
#RewriteCond %{REQUEST_URI} !^/index.php$ 
RewriteRule "^(.*)$" "${custommap:$0}" [R,L,NC] 
</IfModule> 

map.txtは含まれています

abc http://www.example.com/higher_education/companion/politics/abc.html 
google https://www.google.com 

問題は.htaccssファイルはまた、いくつかのRewriteRuleが含まれています。

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/(.*)\.html$ /index.php?sid=$1&ssid=$2 [L,NC,QSA] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)\.html$ /index.php?sid=$1 [L,NC,QSA] 

だから、どんな要求が.htmlが付属していますが、標準のCMS機能としてindex.phpによって提供されます。しかし、コードはリダイレクトループに入ります。 誰かがこの問題を緩和するためにいくつかの光を分かち合っているなら、それは素晴らしいことでしょう。 Apacheのバージョンは2.2なので、IF-ELSEは使えません。

よろしく、
Aneek

あなたは RewriteMapからURLを提供するルールにいくつかの制限を置く必要があり

答えて

0

:これはURIでなしDOTで唯一の非ファイルとディレクトリ以外を確保する

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond ${custommap:$0} !^$ 
RewriteRule ^[^.]+$ ${custommap:$0} [R=301,L,NE] 

ますcustommapによって処理されます。

さらに重要なことに、は、リダイレクトする前にcustommapにマッピングの存在をチェックします。

この変更をテストする前に、ブラウザのキャッシュをクリアしてください。

+0

こんにちは、私はこれを試して、はい、これはファイルの拡張子が存在しないそのビットのために働いた。ただし、リダイレクトする必要があるURLがある場合、これは別の問題です。何をすればいいですか? –

+0

'RewriteRule。+ $ {custommap:$ 0} [R = 301、L、NE]'も正常に動作するはずですが、マップファイルのキー名にDOTを避けることができない理由はわかりません。 – anubhava

+0

ありがとう、私はこれもチェックします。 –