1

ブログを 1 つの CMS/ブログ システムから、いくつかのデフォルトの Apache 書き換えルールを持つ Habari を使用するように切り替えました。古い記事の URL をすべて から にリダイレクトしようとしてい/articles/article-nameます/article-name。以下に、私が使用している URL 書き換えと Habari システムに含まれているデフォルトを掲載しましたが、配置の問題である可能性があると思います。私の書き直しは彼らの書き直しより上であるべきですか?

Habari デフォルトの Apache Rwrites:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteBase /
RewriteRule . index.php [PT]
RewriteRule ^(system/(classes|handlers|locale|schema|$)) index.php [PT]

Habari Rewrite Rules の最後に付けられた My URL Rewrite

RewriteRule ^/articles/(.*)$ /$1 [R=301,PT]
4

3 に答える 3

1

注: 1つの回答がすでに受け入れられていることは知っていますが、おそらくこれで問題が解決するでしょう:

あなたのルール:RewriteRule ^/articles/(.*)$ /$1 [R=301,PT]

ルールが 1 つの .htacces ファイル内にある場合、次の理由により機能しません。

「...したがって、^/ を含むパターンは、ディレクトリごとのコンテキストでは一致しません...」 (ディレクトリごとの書き換えから抽出)

.htaccess ファイルで使用する場合、ルールは次のようになります。

RewriteRule ^articles/(.*)$ /$1 [R=301,PT]

ただし、ディレクトリ/articlesが存在しない場合、最初のルールが使用され、最初のルールが新しいリクエストを作成するため、あなたのルールは適用されません。

その場合は、現在のコードを次のように変更する必要があります。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteBase /

# Add next line if directory "/articles" doesn't exist. 
# If exists, the previous condition "%{REQUEST_FILENAME} !-d" 
# will exclude it from the rule. 
RewriteCond %{REQUEST_URI}  !/articles [NC]

RewriteRule . index.php [PT]

# Add new rule
RewriteRule ^articles/(.*) /$1 [R=301,PT,NC]

RewriteRule ^(system/(classes|handlers|locale|schema|$)) index.php [PT]

上記の変更は、メインの Apache 構成ファイルのコードにも有効ですが、書き換えルールは次のようにする必要があります。

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

あなたの質問のルールに似ています。

于 2013-05-01T03:53:58.160 に答える
0

説明: 要求された URL をオンザフライで書き換えるルールベースの書き換えエンジンを提供します ステータス: 拡張モジュール 識別子: rewrite_module ソース ファイル: mod_rewrite.c 概要 mod_rewrite モジュールは、PCRE 正規表現パーサーに基づくルールベースの書き換えエンジンを使用します。要求された URL をオンザフライで書き換えます。デフォルトでは、mod_rewrite は URL をファイルシステム パスにマップします。ただし、ある URL を別の URL にリダイレクトしたり、内部プロキシ フェッチを呼び出したりするためにも使用できます。

mod_rewrite は、無制限の数のルールを使用して URL を操作する柔軟で強力な方法を提供します。各ルールには、サーバー変数、環境変数、HTTP ヘッダー、またはタイム スタンプに基づいて URL を書き換えることができるように、無制限の数のルール条件を関連付けることができます。

mod_rewrite は、path-info セクションを含む完全な URL パスで動作します。書き換えルールは、httpd.conf または .htaccess で呼び出すことができます。書き換えルールによって生成されるパスには、クエリ文字列を含めることができます。または、内部サブ処理、外部要求リダイレクト、または内部プロキシ スループットにつながる可能性があります。

詳細、説明、および例は、詳細な mod_rewrite ドキュメントに記載されています。

ディレクティブ RewriteBase RewriteCond RewriteEngine RewriteMap RewriteOptions RewriteRule トピック ログ コメント top ログ

mod_rewrite は、トレース 1 からトレース 8 ログ レベルでのアクションの詳細なログを提供します。ログ レベルは、LogLevel ディレクティブを使用して mod_rewrite 用に特別に設定できます。デバッグ レベルまで、アクションはログに記録されませんが、trace8 は実質的にすべてのアクションがログに記録されることを意味します。

mod_rewrite のトレース ログ レベルを高くすると、Apache HTTP サーバーの速度が大幅に低下します。デバッグの目的でのみ、trace2 よりも高いログ レベルを使用してください。例

LogLevel アラートの書き換え:trace3 RewriteLog

mod_rewrite の以前のバージョンに精通している人は、間違いなく RewriteLog および RewriteLogLevel ディレクティブを探しているでしょう。この機能は、上記の新しいモジュールごとのロギング構成に完全に置き換えられました。mod_rewrite 固有のログ メッセージだけを取得するには、ログ ファイルを grep にパイプします: tail -f error_log|fgrep '[rewrite:'

于 2015-03-10T13:05:20.897 に答える