アプリDruplal URLを書き換えます。

7645 ワード

ソース:http://www.cnblogs.com/ghj1976/archive/2010/07/19/1780844.html
 
druplalとディレクトリの下にhttaccessファイルがあります。このファイルにはURLアドレスの書き換えの設定情報があります。配置情報は以下の通りです。
# Various rewrite rules.
<IfModule mod_rewrite.c>
  RewriteEngine on

  # If your site can be accessed both with and without the 'www.' prefix, you
  # can use one of the following settings to redirect users to your preferred
  # URL, either WITH or WITHOUT the 'www.' prefix. Choose ONLY one option:
  #
  # To redirect all users to access the site WITH the 'www.' prefix,
  # (http://example.com/... will be redirected to http://www.example.com/...)
  # adapt and uncomment the following:
  # RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
  # RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
  #
  # To redirect all users to access the site WITHOUT the 'www.' prefix,
  # (http://www.example.com/... will be redirected to http://example.com/...)
  # uncomment and adapt the following:
  # RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
  # RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

  # Modify the RewriteBase if you are using Drupal in a subdirectory or in a
  # VirtualDocumentRoot and the rewrite rules are not working properly.
  # For example if your site is at http://example.com/drupal uncomment and
  # modify the following line:
  # RewriteBase /drupal
  #
  # If your site is running in a VirtualDocumentRoot at http://example.com/,
  # uncomment the following line:
  # RewriteBase /

  # Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>
 
RewriteEngine onは書き換えエンジンのスイッチであり、オフに設定すれば、書き換え規則の定義は適用されなくなります。このスイッチのもう一つの利点は、書き換えルールを一時的に外すために、offに変更してAppacheを再起動すればいいです。次の条の書き換え規則は必ず解除されません。
RewriteCond条件書き換え規則は、後に定義された条件を満たすと次の書き換え規則が適用されます。RewriteCondの文法は以下の通りです。RewriteCond  TestString CodPattern[flags]
 
TestString
TestStringは純粋なテキストの文字列ですが、いくつかの拡張要素を含んでもいいです。ここでは%を通じて(通って)サーバー変数を参照します。
サーバ変数:
REQUST_FILENAME  要求に一致する完全なローカルファイルシステムのファイルパス名です。
REQUST_URIは、HTTP要求行において要求されるリソース(例えば、「/index」)である。
 
CondPattern
CondPatternは条件モードであり、現在のTestString例に適用される正規表現である。TestStringは最初に計算され、その後CondPatternと整合します。
例えば:RewriteCond%{REQUSTuURI}!=/favicon.ico  要求された住所はfavicon.icoではなく、下の住所の書き換えをトリガするという意味です。
!(驚嘆符)不一致を指定します。'-d'(目次)  TestStringをパス名として扱い、存在するディレクトリかどうかをテストします。f'(一般ファイル)  TestStringをパス名として扱い、既存のファイルかどうかをテストする。
だから:RewriteCond%{REQUSTuFILENAME}!f  要求されたファイルが存在しない場合は、後のアドレスの書き換えをトリガするという意味です。
RewriteCond%{REQUST FILENAME}!-d  要求されたディレクトリが存在しない場合、後のアドレスをトリガーして書き換えます。
より多くのこのパラメータの書き方は参照できます。  http://www.52web.com/52article/?view-258.
 
[flags]
また、CondPatternの後に、RewriteCondコマンドの3番目のパラメータとして特別なフラグを追加することができます。flagsはカンマで区切られた以下のマークのリストです。
'nocase𞓜NC'(大文字小文字を無視して)テストを行い、大文字と小文字を無視し、拡張したTestStringとCondPatternの'A-Z'と'a-z'は区別がありません。このマークはTestStringとCondPatternの比較のみに使用されますが、ファイルシステムとサブ要求のチェックには機能しません。ornext|OR'(または次の条件)はOR方式でいくつかの規則の条件を組み合わせています。暗黙のANDではありません。典型的な例は以下の通りです。
  
RewriteRule 具体的な書き換え策:
RewriteRuleの文法は後のようです。  RewriteRule Pattern Substitution[flags]
 
Pattern
Appache 1.2および以降のバージョンに対して、テンプレートは現在のURLにマッチするPOSIX正則式です。現在のURLは必ずしも最初に提出されたURLとは限らない。一部の規則でこの規則の前にURLを処理したからである。
ここは^(.*)$で、行の任意のアドレス要求を意味します。
 
Substitution
マッチングが成功すると、対応するマッチングを置き換えるためにSubstitutionが使用されます。
ここのRewriteRule^(.*)はindex.php?q=1です。  もともと要求していたものがあれば/aa/dddであることを意味する。  書き換えると住所がindex.php?q=/aa/dddになります。
これは普通の文字列以外にも含まれます。 1.$N、RewriteRuleテンプレートにマッチする関連文字列を参照し、Nは番号、N=0..9を表します。 2.%N,最後のRewriteCondテンプレートにマッチするデータを参照して,Nはシーケンス番号を表します。 3.%{VARNAME}サーバ変数 4.{mapname:key_default}マッピング関数が起動します。
より多くの情報は参照できます。http://www.ixdba.net/article/ae/1443.html
 
[flags]
RewriteRuleコマンドの3番目のパラメータとして使用します。Flagsはカンマで区切られたマークを含むリストです。
ここのL、QSAはそれぞれ次のような意味です。
'ラストルールlast'(最後のルールlast)は、書き換え操作を直ちに停止し、他の書き換えルールを適用しない。Perl中のlastコマンドまたはC言語中のbreakコマンドに対応します。このフラグは、現在書き換えられているURLが、その後続のルールのために書き換えられることを阻止することができる。例えば、ルートパスのURL('/')を書き換えることができるのは、実際に存在するURLであり、例えば'/e/www/'.
'qsappend|QSA'(追加要求串query string append)このマークは強制的に書き換えエンジンに既存の代替列に一つの要求列を追加して、簡単な代替ではない。書き換え規則によって要求列に情報を追加する必要があるなら、このマークを使用することができます。
例えば/user/ghj 1976を/user.php?uid=ghj 1976にリダイレクトしたいなら、私のルールはこうしなければなりません。
でももし私たちが希望するなら/user/ghj 1976?key=java  リダイレクト  /user.php?uid=ghj 1976&key=java
RewriteRule^user/(^/)$  このようにQSAを増えればいいです。
QSAがないと、このパラメータkey=javaが追加で渡されます。
詳細は参照できます。  http://space.itpub.net/16555225/viewspace-495945