15

以下の内容の単純な .htaccess ファイルがあります。

<IfModule mod_rewrite.c>
     RewriteEngine on

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d

     RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>

このルールを追加したい。

RewriteRule ^p$ index.php?p= 

以下でやってみましたが、うまくいきません。両方のルールが実行されているようです。いくつかの異なるフラグを試しましたが、やはりうまくいきませんでした。誰かがこれを機能させる方法を教えてください。

<IfModule mod_rewrite.c>
     RewriteEngine on

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d

     RewriteRule ^p$ index.php?p= 
     RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>
4

2 に答える 2

51

[L]1 つ一致した場合にルールの読み取りを停止するには、フラグを追加する必要があります。

<IfModule mod_rewrite.c>
     RewriteEngine on

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d

     RewriteRule ^p$ index.php?p= [L]
     RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>

RewriteRuleフラグのリマインダー:

  • L = ラスト。これが一致したら、RewriteRules の処理を​​停止します。注文数!
  • C = チェーン。次の RewriteRule の処理を​​続行します。このルールが一致しない場合、次のルールは実行されません。これについては後で詳しく説明します。
  • E = 環境変数を設定します。Apache には、Web サーバーの動作に影響を与えるさまざまな環境変数があります。
  • F = 禁止。このルールが一致する場合、403-Forbidden エラーを返します。
  • G = なくなった。このルールが一致する場合、410-Gone エラーを返します。
  • H = ハンドラー。指定された MIME タイプであるかのように要求を強制的に処理します。
  • N = 次へ。ルールを強制的に最初からやり直し、再一致させます。気をつけて!ループが発生する可能性があります。
  • NC = ケースなし。[jpg] が jpg と JPG の両方に一致することを許可します。
  • NE = 逃げ場なし。特殊文字 (. ? # & など) を同等の 16 進数コードに書き換えるのを防ぎます。
  • NS = サブリクエストなし。server-side-includes を使用している場合、これにより、含まれるファイルとの一致が妨げられます。
  • P = プロキシ。ルールが mod_proxy によって処理されるように強制します。ウェブサーバーがコンテンツを取得して再提供するため、他のサーバーから透過的にコンテンツを提供します。これは危険なフラグです。不適切なフラグを作成すると、Web サーバーがオープン プロキシになり、それは悪いことです。
  • PT = パススルー。RewriteRule マッチングで Alias ステートメントを考慮します。
  • QSA = QSAppend。元の文字列にクエリが含まれている場合 ( http://example.com/thing?asp=foo )、元のクエリ文字列を書き換えられた文字列に追加します。通常は破棄されます。動的コンテンツにとって重要です。
  • R = リダイレクト。指定された URL への HTTP リダイレクトを提供します。正確なリダイレクト コード [R=303] も提供できます。RedirectMatch と非常に似ていますが、これはより高速であり、可能な場合は使用する必要があります。
  • S = スキップ。このルールをスキップします。
  • T = タイプ。返されるコンテンツの MIME タイプを指定します。AddType ディレクティブに非常に似ています。

この(非常に)完全な投稿からの抜粋: https://serverfault.com/questions/214512/everything-you-ever-wanted-to-know-about-mod-rewrite-rules-but-were-afraid-to-as

于 2012-08-28T09:07:43.310 に答える
13

最初に、書き換え条件は次の書き換えルールにのみ影響することを知っておく必要があります。これは、書き換え条件と書き換えルールの間に新しいルールを追加した場合です。つまり、古いルールには影響せず、新しいルールにのみ影響します (あなたのコードは、対象となる URL がファイルまたはディレクトリでない場合にのみ書き換えルールが実行されることです)、したがって、古いルールを引き続き書き換え条件の影響を受けるようにする場合は、書き換えの前に新しいルールを追加する必要があります。条件。

あなたの問題については、zessxが十分に答えたと思います([L]フラグを追加することで修正されます)。

最後に、次のようなものが必要です。

<IfModule mod_rewrite.c>
     RewriteEngine on

     RewriteRule ^p$ index.php?p= [L]

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d
     RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>
于 2012-08-28T09:17:15.757 に答える