web-dev-qa-db-ja.com

最も一般的に使用される基本的なApache htaccessリダイレクトは何ですか?

この質問はここにあるので、htaccessファイルを使用してApacheで1つ以上の一般的または基本的なリダイレクトを行う方法に関する情報を探しているユーザーに提供できます。質問の対象となる情報を見つけることに関する将来の質問はすべて、この質問の複製として終了する必要があります。 このメタ質問による

この質問のポイントは何ですか?完璧ではないアイデアはApacheプラットフォームで、ある種のランプまたはライブサーバー上のhtaccessを使用して、リダイレクトに関するよくある質問をキャッチします。回答のタイプは一般に、世界中の100,000のサイトで使用されていると想像できるものである必要があり、ここではさまざまな形で何度も何度もプロWebマスターで繰り返し求められます。

私たちが探している答えのタイプのいくつかの例:

  • Www以外をwwwにリダイレクトするにはどうすればよいですか?
  • サブドメインをメインドメインにリダイレクトするにはどうすればよいですか?
  • サブフォルダーをドメインからルートまたはサブドメインにリダイレクトするにはどうすればよいですか?
  • 古いURLを新しいURLにリダイレクトするにはどうすればよいですか?

探していない答えのタイプのいくつかの例:

  • リダイレクトを伴わない回答。
  • NGinx、IIS、またはその他のApache以外のプラットフォームに関する回答。
  • カスタムで複雑な文字列またはクエリの削除を含む回答。

高度な複雑なMod_Rewriteルールのリソース:

注意してください:この質問はまだ建設中であり、懸念や質問がある場合は、自分またはプロのウェブマスターの実際のモデレーターのどちらかによって洗練されたもの ここで数日前に作成したメタページを使用してください

5
Simon Hayter

Mod_aliasおよびMod_rewrite

Htaccess内でリダイレクトを制御するために使用できる2つのモジュールがあり、これらは mod_alias および mod_rewrite として知られています。以下の2つの違いを明確にするために、mod_aliasまたはmod_rewriteを使用しているときに慣れ親しむコマンドがいくつかあります。

mod_aliasコマンド

mod_rewriteコマンド

mod_aliasはより単純なリダイレクトメソッドと見なされますが、mod_rewriteはより高度でより多くのディレクティブを許可します。 mod_aliasの前にmod_rewriteコマンドが実行されることに注意してください。


リダイレクトコード

  • 301常設
  • 302一時的な

古いURLを新しいURLにリダイレクトする方法は?

Htaccessを使用して1つのページを別のページにリダイレクトする方法は多数あります。301は一般的に最も重要であり、ほとんどの場合ページは一時的なリダイレクトではなく永続的なリダイレクトを必要とするため使用されます。パーマネントリダイレクトは、あるページのランキングを別のページに維持しようとするのに最適です。

301パーマネント

リダイレクト301:Redirect 301 /old.html http://www.example.com/new-url/

RedirectPermanent:RedirectPerm /old.html http://www.example.com/new-url/

RedirectMatch:RedirectMatch 301 ^old.html$ http://www.example.com/new-url/

RewriteRule:

RewriteEngine On
RewriteBase /
RewriteRule ^old.html$ http://www.example.com/new-url/ [R=301,NC,L]

302テンポラリー

リダイレクト302:Redirect 302 /old.html http://www.example.com/new-url/

RedirectTemp:RedirectTemp /old.html http://www.example.com/new-url/

RedirectMatch:RedirectMatch 302 ^old.html$ http://www.example.com/new-url/

RewriteRule:

RewriteEngine On
RewriteBase /
RewriteRule ^old.html$ http://www.example.com/new-url/ [R,NC,L]

すべてをキャッチして、非wwwをwwwにリダイレクトする

$ 1変数はページ名をキャッチするため、サイトのwww以外のバージョンに対するすべてのリクエストのリダイレクトにmod_writeを使用することを選択する必要があります。したがって、example.com/page1/は自動的にwww.example.com/page1/にリダイレクトされます。

mod_rewrite:

RewriteEngine On
RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_Host}/$1 [R=301,L]

mod_alias:

<If "%{HTTP_Host} != 'www.example.com'">
    Redirect permanent / http://www.example.com/
</If>

すべてをキャッチして、wwwをno-wwwにリダイレクトする

mod_rewrite:

RewriteEngine On
RewriteCond %{HTTP_Host} ^www.example.com$ [NC]
RewriteRule ^(.*)$ http://example.com$1 [R=301,L]

mod_alias:

<If "%{HTTP_Host} != 'example.com'">
    Redirect permanent / http://example.com/
</If>

すべてをキャッチしてwwwをno-www(HTTPS)にリダイレクト

RewriteEngine On
RewriteCond %{HTTP_Host} ^www.example.com$ [NC]
RewriteRule ^(.*)$ https://example.com$1 [R=301,L]

特定のページでTLSを強制し、残りで無効にします

このスクリプトは、ログインページと登録ページを除く他のすべてのページのTLSを削除します。ファイル名の区切り文字として|を使用するだけで追加できます。

mod_rewrite:

RewriteCond %{HTTPS} on
RewriteCond %{SCRIPT_FILENAME} !\/(login|register)\.php [NC]
RewriteRule ^(.*)$ http://%{HTTP_Host}/$1 [R=301,L]

サイト全体でTLSを実施する

完全なサイトでTLSを実施する場合、mod_rewriteを使用してHTTPSオフを検出できます。

mod_rewrite:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} 

Mod_rewriteを使用してURLから拡張子を削除する

一部のWebホストでは、htaccessでOptions -MultiViewsを使用してこれらの拡張機能を削除し、拡張機能なしでテストし、機能しない場合は単純に追加する必要があります。

拡張機能タイプPHPの削除:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

拡張機能タイプHTMLの削除:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

拡張タイプHTMの削除:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.htm [NC,L]

動かない?これを試してください(phpを削除するファイル拡張子に変更します):

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

末尾のスラッシュの削除と強制

強制:

これにより、末尾の/のないすべてのリクエストが、最後にスラッシュが付いたURLにリダイレクトされます。 (括弧の2番目の部分内にあるのは無視するファイル拡張子です...画像のURLに/を適用することは意味をなさないためです。

RewriteCond %{REQUEST_URI}  !\.(php|html?|jpg|gif)$
RewriteRule ^(.*)([^/])$ http://%{HTTP_Host}/$1$2/ [L,R=301]

削除:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} (.*)$
RewriteRule ^(.+)/$ http://www.example.com/$1 [R=301,L

バックスラッシュをスラッシュに変換します

これにより、URLで見つかったすべてのバックスラッシュがスラッシュに変換されます。重複コンテンツの防止に適しています:

RewriteEngine On
RewriteCond %{REQUEST_URI} (.*)\\(.*)
RewriteRule .* %1/%2 [R=301]

古いドメインを新しいドメインにリダイレクトする

RewriteEngine On

# Redirect Entire Site to New Domain
RewriteCond %{HTTP_Host} ^example.com$ [OR]
RewriteCond %{HTTP_Host} ^sub-domain.example.com$ [NC]
RewriteRule ^(.*)$ http://new-example.com/$1 [R=301,L]

新しいドメインにリダイレクトしてサブフォルダーを削除

RewriteEngine On

# Rename folder to match the sub folder you wish to remove  
RewriteCond %{HTTP_Host} ^(www\.)?example-old\.com$ [NC]
RewriteRule ^folder(/.*)?$ http://www.example-new.com$1 [L,R=301]
8
Simon Hayter