2016-08-09 14 views
1

私は最近drupalに変換した静的なHTML Webサイトを持っていました。私はウェブマスターツールとDrupalレポートで自分のサイト404エラーを監視しており、Googleが奇妙なURLを索引付けしていることに気づいた。私の推測では、古い静的なHTMLサイトから不適切に作成された相対的なリンクからのものです。ここで2ピリオドの奇妙なURLをリダイレクト

は一例です: www.example.com/items../item-page.html

実際のページは次のとおりです。 www.example.com/items/item-page.html

新しいdrupalサイトには.html拡張子もありません。私はURLリダイレクトとパス自動モジュールを使用しており、古いURLのすべてをリダイレクトして、新しいURL構造に301'dすることを確認しています(例:www.example.com/items/item-page.htmlは301になります)。 www.example.com/items/item-pageに)。

サーバーにアクセスできるため、.htaccessの代わりにApacheのhttpd.confファイルでリダイレクトを行っています。私はに../リダイレクトするために、次のコードを試してみました/私は運を持っていないです:

RewriteRule ^\.\./(.*) /$1 [R=301,NC,L] 

私は../その中でURLに移動したときにこのルールは何もしません。 ../と一致し、任意のURLから削除することができる再書き込みがありますか?

注:だから私はその私のサーバー構成を考えていない

RewriteRule ^items/pdf/(.*)$ /sites/default/files/documents/items/$1 [R=301,NC,L] 

:私は正常に動作しているapacheのhttpd.confの他のリダイレクト...などがあります。

EDIT: 上記の書き換えルールは、pdfディレクトリの書き換えルールがURLの..であっても機能することに気付きました。例: http://www.example.com/items../pdf/somedocument.pdf へのリダイレクト http://www.example.com/sites/default/files/documents/items/somedocument.pdf リライトルールでは..が完全に無視されているため、何もできません。誰もそれを回避する方法を知っていますか?

答えて

0
  1. スラッシュをエスケープする必要があります。
  2. 私はrewriteruleがページリンクではなくHTTPリクエストURIに対して動作すると信じています。 したがって、一致を見つけるためにカラットを削除し、意図的なURLを分析して、それが他の場所に悪影響を及ぼすかどうかを確認する必要があります。
+0

キャレットを削除して前方スラッシュをエスケープしようとしました(キャレットがまだその位置にあるままスラッシュをエスケープしようとしましたが)、それでも私には404が与えられ、リダイレクトされません。 –

+0

404(Apacheのエラーログ)になるグループ1の値が見えますか?上記と同じように、あなたの現実世界のルールの$ 1から完全なパスを省略しましたか?例えば/ sites/default/files/documents/items/$ 1の代わりに$ 1? – Xorandnotor

+0

これはerror.logにエラーはありません。 Access.logには、 192.168.1.119 - - [09/Aug/2016:09:37:22 -0400] "GET /items/item-page HTTP/1.1" 404 67516 が表示されます。完全なパスを省略することを意味します。明確にするために、私がリストした2番目の書き換えルールは、自分のサーバー上で意図した通りに他のリダイレクトが働いていることを示しています。私が働いているのは、古いファイル構造のpdfsをpdfsを保存しているdrupalの新しいファイル構造にリダイレクトすることです。注:私は自分のローカル開発サーバー上でこれらのリダイレクトをテストしていますので、IPアドレスがローカルIPである理由がわかります。 –

0

あなたは、私がリライトを使用して問題を解決することができませんでした。これは、/items..foobarへ/アイテム/ foobarに

+0

私はそれを試しましたが、まだ運がない、URLはまったく書き換えられません。 –

0

をリダイレクトします。この

RewriteRule ^/items\.\.(.+)$ /items/$1 [L,R] 

を使用することができます不明の理由でurlに ".."が見つからないという書き換え規則のために、Apacheのルールが適用されます。

私の解決策は、URLに ".."が含まれているかどうかを調べるカスタムDrupalモジュールを作成することでした。 ".."文字列が見つかった場合は、組み込みのdrupal関数を使用してURLに ".."を付けずにリダイレクトするように設定しています。私のモジュールで使用したコードは次のとおりです。

function doubledot_fix_init() { 
    $destination = drupal_get_destination(); 
    $alias = drupal_get_path_alias($destination['destination']); 
    $fixpath = str_replace("..", "", $alias, $count); 
    if ($count > 0) { 
     drupal_goto($fixpath, array(), 301); 
    } 
} 

「..」は実際にどのURLにも見つからないはずなので、この修正により何かが壊れてしまう理由はありません。この修正によって問題が発生する可能性があると思う人、またはより良い解決策を知っている人は、私に知らせてください。

関連する問題