2

基本的に私は自分のサイトでSEOに対応できるように取り組んでいます。私は以下を達成したかった:

  • URLをきれいなものに書き直します
  • 複数のスラッシュを削除します(例example.com/////something///example.com/something/
  • wwwバージョンをwww以外のバージョンにリダイレクトします。
  • すべてのURLからindex.phpファイルを非表示にします
  • /?id=something/古いものから(新しいURLに/something/)リダイレクトする

.htaccess私はこのコードを思いついた:

RewriteCond %{THE_REQUEST} //
RewriteRule .* $0 [R=301]

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteCond %{QUERY_STRING} ^id=([a-z0-9\/-]+)
RewriteRule ^(.*)$ http://example.com/%1? [R=301]

RewriteRule ^index.php(.*)$ /$1 [R=301]
RewriteRule ^([a-z0-9\/-]+)$ /?id=$1 [L] 

...そしてそれは機能していますが、副作用があります:チェーンリダイレクト、例えば。example.com/?id=something//////-> example.com/something//////->example.com/something/

それで、このコードを書き直したり変更したりして、URLの優先バージョンに一度だけリダイレクトする方法はありますか?

4

2 に答える 2

1

あなたが望むものを解釈しようとして、あなたの質問のルールを見てみましょう:

.1 これの目的を理解できません:

RewriteCond %{THE_REQUEST} //
RewriteRule .* $0 [R=301]

.2質問のこのルールセットは、クエリ文字列を削除しwwwてに変換しますが、両方の条件が満たされる必要があるため、着信URIにANDクエリ文字列がある場合のみ:?id=val/valwww

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteCond %{QUERY_STRING} ^id=([a-z0-9\/-]+)
RewriteRule ^(.*)$ http://example.com/%1? [R=301]

.3 このルール

RewriteRule ^index.php(.*)$ /$1 [R=301]

を非表示index.phpにしますが、ルート ディレクトリにある場合のみです。例:

http://www.example.com/index.php?id=val

サブディレクトリにある場合は機能しません。例:

http://www.example.com/folder/index.php?id=val

.4 この目的が理解できない:

RewriteRule ^([a-z0-9\/-]+)$ /?id=$1 [L]

代わりにこれをお勧めします:

RewriteEngine On
RewriteBase /

#Redirects all www to non-www
RewriteCond %{HTTP_HOST} www\.example\.com$ [NC]
RewriteRule ^(.*)/?$ http://example.com/$1 [R=301,L]

#Hides "index.php" keeping the query if present
RewriteRule ^(.*)/index\.php$ $1/ [R=301,QSA,L]

#Converts query string `?id=val` to `/val`
RewriteCond %{QUERY_STRING} id=([^/]+)
RewriteRule .* /%1? [R=301,L]
于 2012-12-29T03:58:18.133 に答える
1

クモは数か月後に正しい新しい構造に「適応」し、最終的には問題が最初に見えるよりもはるかに深刻でなくなる可能性があることを忘れないでください. 「古い」参照を修正するために常にそこにあることを知っていれば、すべての .htaccess コードをそのままにしておくことができますが、実際にはほとんど使用されません。

URL をある種の標準的な形式に「修正」するときに、クライアントへの複数回の往復を回避する簡単な方法を見つけたことがありません。mod_rewrite は、返されたコンテンツが、URL によって暗示されたものと完全に一致しないファイル構造から派生したものであることにクライアントが気付かない「ローカル」リダイレクトのケースにより焦点を当てているようです。

すべての URL mod をローカルに保存し、新しく作成された「環境」変数にすべてを設定して、すべての URL 修正を一度に配信するクライアントへのラウンド トリップを 1 回だけ引き起こすことができます。?」しかし、そうするのは非常に冗長で、扱いにくく、エラーが発生しやすく、「推奨される手法」にはなりませんでした。

于 2015-09-06T19:56:28.587 に答える