ホームページ  >  記事  >  バックエンド開発  >  htaccess 構文チュートリアル Apache サーバーの疑似静的ルール チュートリアル_PHP チュートリアル

htaccess 構文チュートリアル Apache サーバーの疑似静的ルール チュートリアル_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:11:49840ブラウズ

htaccess 構文チュートリアル Apache サーバーの疑似静的ルール チュートリアル

注: Discuz! フォーラムで静的ルールを探している場合は、ここを参照する必要はなく、Discuz! の背景にリンクがあるので、それをコピーするだけです。 PHPwind については使用したことがないのでわかりません。バックグラウンドにあるはずです。

最近、Apacheの書き換えルールを勉強していますが、インターネット上にたくさんのチュートリアルがありますが、そのほとんどが個人から盗用したものであり、完全ではないことがわかったので、簡単で簡単なものを書きたいと思います。チュートリアルは、ディレクトリの保護から始まります。これは、インターネット上で選択できるエディターもいくつかありますが、ここでは説明しません。インターネット上にもチュートリアルがあります。そのほとんどはある人からのコピーです。チュートリアルは次のように書かれています。

リライトエンジンオン

RewriteCond%{HTTP_HOST}^(www.)?xxx.com$

RewriteCond%{REQUEST_URI}!^/blog/

RewriteCond%{REQUEST_FILENAME}!-f

RewriteCond%{REQUEST_FILENAME}!-d

書き換えルール^(.*)$/ブログ/$1

#ファイル名を入力しない場合は、デフォルトでホームページに移動します

RewriteCond%{HTTP_HOST}^(www.)?xxx.com$

RewriteRule^(/)?$blog/index.php[L]

それが何を意味するのか説明しましょう:

[RewriteEngineOn] は、書き換えエンジンがオンまたはオフであることを意味します。この機能は、ステートメントを 1 つずつコメントする必要がないように、次のステートメントを便利にオンまたはオフにすることです。

【RewriteCond%{HTTP_HOST}^(www.)?xxx.com$】

これは書き換え条件です。前の %{HTTP_HOST} は、プレフィックス部分のみを参照する、www.xxx.com を表します。^ は、文字列の先頭、$ は文字列の末尾を示し、. はエスケープされないことを意味します。一部のサーバーがサポートしていないことを防ぐためにエスケープすることをお勧めします。 1 回、このルールの意味は、アクセスした URL が xxx.com または www.xxx.com の場合、次のステートメントを実行し、一致しない場合はスキップします。

【RewriteCond%{REQUEST_URI}!^/blog/】

これは書き換え条件でもあります。%{REQUEST_URI} は、訪問の相対アドレスを表します。これは、ドメイン名 / の後のコンポーネントであるルート ディレクトリからの相対アドレスです。この形式には、最初の「/」が含まれます。非を意味します。このステートメントはアクセスを表します。アドレスは /blog/ で始まりません。単に ^ で始まり、$

で終わりません。

【RewriteCond%{REQUEST_FILENAME}!-f】

【RewriteCond%{REQUEST_FILENAME}!-d]

これら 2 つの文の意味は、要求されたファイルまたはパスが存在しない場合、既存のファイルまたはパスが返されるということです。

【RewriteRule^(.*)$/blog/$1】書き換えルール、最も重要な部分は、上記の RewriteCond 条件が満たされた場合にこの書き換えルールが実行されることを意味します。^(.*)$ は正規表現の一致です。 ^(.*)$ は現在の URL の任意の文字と一致することを意味します。 . は任意の 1 文字を意味します。 * は 0 回または N 回 (N>0) 回一致することを意味します。 /blog/$1 は書き換えコンポーネントです。これは、以前に一致した文字を /blog/$1 に書き換えることを意味します。この $1 は逆一致を表し、最初の括弧内のコンポーネント、つまり ^(.*)$ .* を参照します。実際、問題が発生します。これについては後で説明します。

【RewriteCond%{HTTP_HOST}^(www.)?xxx.com$】

【RewriteRule^(/)?$blog/index.php[L]】

この 2 つの文の意味は、要求されたホスト アドレスが www.xxx.com で、アドレスの末尾に「/」が 0 または 1 つしかない場合は、サブディレクトリのホームページに書き換えられると思われます。これは主に書き換えられたアドレスはホームページを自動的に見つけられないため、自分で指定する必要があります。

それでは、問題について説明しましょう。RewriteRule^(.*)$/blog/$1^(.*)$ の最初の部分は、現在要求されている URL と一致します。たとえば、要求された URL は http://www.xxx です。 .com/ a.html は、http://www.xxx.com/a.html 全体に一致しますか、/a.html (バックスラッシュの後のコンポーネント) のみに一致しますか、それとも a.html のみに一致しますか。

答えは次のとおりです。 RewriteBase のルールによれば、 rewritebase が / の場合、先行するバックスラッシュなしの a.html と一致するため、前のステートメントは RewriteRule^(.*)$blog/$1 (/ なし) として記述する必要があります。ただし、実際のアプリケーションでは、バックスラッシュの有無にかかわらず、前にバックスラッシュを付けて使用することもできます。ここで問題が発生します。rewritebase が / に設定されていない場合、URL 全体 http://www.xxx.com/a.html が一致することになるため、これを追加する必要があります。

リライトベース/

もう 1 つの問題は、全員が入力した URL が小文字であるという保証がないことです。URL が大文字で入力された場合、Linux システムでは大文字と小文字が区別されるため、大文字と小文字を無視するには RewriteCond の後に [NC] を追加する必要があります。

この時点で、完全な文は次のようになります:

####スタート####

リライトエンジンオン

リライトベース/

RewriteCond%{HTTP_HOST}^(www.)?xxx.com$[NC]

RewriteCond%{REQUEST_URI}!^/blog/

RewriteCond%{REQUEST_FILENAME}!-f

RewriteCond%{REQUEST_FILENAME}!-d

書き換えルール^(.*)$ブログ/$1

#ファイル名を入力しない場合は、デフォルトでホームページに移動します

RewriteCond%{HTTP_HOST}^(www.)?xxx.com$[NC]

RewriteRule^(/)?$blog/index.php[L]

####終了####

その後にさらにステートメントがある場合は、最後の [L] を追加しないでください。これは最後のステートメントを意味するためです

ホットリンクを防ぐには、次のように RewiteBase/ を追加する必要もあります:

リライトエンジン

リライトベース/

RewriteCond%{HTTP_REFERER}!^$[NC]

RewriteCond%{HTTP_REFERER}!xxx.info[NC]

RewriteRule.(jpg|gif|png|bmp|swf|jpeg)$/error/daolian.gif[R,NC,L]

後でさらにステートメントがある場合、最後の [L] は追加しないでください。 /error/daolian.gif は、他の人がホットリンクしたときに表示される画像です。

以下に簡単な文法規則とフラグを添付します:

【RewriteCond構文:】

CondTestStringCondPattern[フラグ]を書き換えます

rewritecond のその他の使用法:

「-d」(ディレクトリ)

TestString をパス名として扱い、それが既存のディレクトリであるかどうかをテストします。

「-f」(通常のファイル)

TestString をパス名として扱い、それが存在する通常のファイルであるかどうかをテストします。

「-s」(空ではない通常のファイル)

TestString をパス名として扱い、それがサイズが 0 より大きい既存の通常のファイルであるかどうかをテストします。

「-l」(シンボリックリンク)

TestString をパス名として扱い、それが既存のシンボリック リンクであるかどうかをテストします。

「-x」(実行可能ファイル)

TestString をパス名として扱い、それが実行可能権限を持つ既存のファイルであるかどうかをテストします。この権限はオペレーティング システムによって検出されます。

‘-F’ (サブリクエストに存在するファイル用)

TestString が有効なファイルであり、サーバーの現在のアクセス制御設定でアクセスできるかどうかを確認します。内部サブリクエストを使用してチェックを実行すると、サーバーのパフォーマンスが低下するため、注意して使用してください。

「-U」(サブリクエスト用URL)

TestString が有効な URL であり、サーバーの現在のアクセス制御設定でアクセスできるかどうかを確認します。内部サブリクエストを使用してチェックを実行すると、サーバーのパフォーマンスが低下するため、注意して使用してください。

【RewriteRule構文:】

RewriteRulePatternSubstitution[フラグ]

【フラグ】:

「chain|C」(次のルールにリンク)

このタグは、現在のルールを次のルールにリンクします。これには、ルールが一致すると、その後続ルールが処理され続けるという効果があります。つまり、このタグは、ルールが一致しない場合、その後続ルールはスキップされます。たとえば、ディレクトリ レベルのルールで外部リダイレクトを実行する場合、「.www」を削除する必要がある場合があります (「.www」はここでは表示されません)。

「cookie|CO=NAME:VAL:domain[:lifetime[:path]]」(cookieを設定)

クライアント側でCookieを設定します。 Cookie の名前は NAME で、値は VAL です。 Domain は Cookie のドメイン (「.apache.org」など)、オプションの Lifetime は Cookie の有効期間 (分)、オプションの path は Cookie のパスです。


‘env|E=VAR:VAL’ (環境変数を設定)

このタグは、環境変数 VAR の値を VAL に設定します。VAL には、拡張可能な正規表現後方参照 ($N および %N) を含めることができます。このタグを複数回使用して、複数の変数を設定できます。これらの変数は、後続の多くの状況で、通常は XSSI () または CGI ($ENV{'VAR'})、または後続の RewriteCond の CondPattern パラメーターで間接的に参照できます。ディレクティブは %{ENV:VAR} によって参照されます。これを使用して、URL から削除された情報を記憶します。

「forbidden|F」(禁止されたU​​RL)

現在の URL を強制的に禁止します。つまり、HTTP 応答コード 403 (禁止) を直ちにフィードバックします。このタグを使用すると、複数の RewriteCond をチェーンして、特定の URL を条件付きでブロックできます。

「gone|G」(URL強制破棄)

現在の URL を強制的に廃止します。つまり、HTTP 応答コード 410 (廃止) を直ちにフィードバックします。このタグは、ページが放棄され、存在しないことを示すために使用します。

‘handler|H=Content-handler’(必須のコンテンツハンドラー仕様)

対象ファイルのコンテンツハンドラーをContent-handlerとして強力にカスタマイズします。たとえば、ScriptAlias ディレクティブは、mod_alias モジュールをエミュレートして、マップされたフォルダー内のすべてのファイルを「cgi-script」プロセッサーによって強制的に処理するために使用されます。

「last|L」(終了ルール)

書き換え操作を直ちに停止し、それ以上の書き換えルールは適用されません。 Perlの最後のコマンドやC言語のbreakコマンドに相当します。このタグは、現在書き換えられている URL が後続のルールによって再び書き換えられるのを防ぐために使用されます。たとえば、これを使用してルート パスの URL (「/」) を実際の URL (例: 「/e/www/」) に書き換えることができます。

「next|N」(最初からやり直す)

書き換え操作を再実行します(最初のルールからやり直します)。このとき、再度処理される URL は元の URL ではなく、最後の書き換えルールによって処理された URL になります。 Perl の next コマンドや C 言語の continue コマンドに相当します。このマークにより、再書き込み操作を再開できます (ループの最初にすぐに戻ります)。ただし、無限ループにならないように注意してください。

「nocase|NC」(大文字と小文字を無視)

パターンが大文字と小文字を区別しないようにします。つまり、パターンが現在の URL と一致する場合、「A-Z」と「a-z」の間に違いはありません。

‘noescape|NE’ (出力で URI をエスケープしない)

このフラグは、mod_rewrite が通常の URI エスケープ ルールを適用して結果を書き換えるのを防ぎます。一般に、特殊文字 (「%」、「$」、「;」など) は、同等の 16 進コード (「%」、「$」、「;」など) にエスケープされます。このフラグは、そのようなエスケープを防止して、パーセント記号などの記号を出力に表示できるようにします。例:

RewriteRule/foo/(.*)/bar?arg=P1=$1[R,NE]

「/foo/zed」を安全なリクエスト「/bar?arg=P1=zed」にリダイレクトできます。

‘nosubreq|NS’(内部サブリクエストを処理しません)

このフラグは、現在のリクエストが内部サブリクエストである場合に、書き換えエンジンに書き換えルールを強制的にスキップさせます。たとえば、mod_include がディレクトリのデフォルト ファイル (index.xxx) を検索しようとすると、Apache は内部でサブリクエストを生成します。ルールの書き換えは必ずしもサブリクエストに役立つわけではなく、ルールセット全体が有効な場合はエラーがスローされる場合もあります。したがって、このタグを使用して特定のルールを除外できます。

使用原則: CGI スクリプトによる処理を強制するために URL に CGI スクリプト接頭辞を追加したが、サブリクエスト処理のエラー率 (またはリソースのオーバーヘッド) が高い場合は、このタグを使用できます。

「プロキシ|P」(プロキシになるよう強制)

このフラグにより​​、置換コンポーネントがプロキシ リクエストとして内部的に強制的に送信され、書き換え処理が直ちに中断され、処理が mod_proxy モジュールに引き渡されます。この置換文字列が mod_proxy で処理できる有効な URI (http://hostname で始まるなど) であることを確認する必要があります。そうしないと、プロキシ モジュールからエラーが返されます。このタグを使用すると、特定のリモート コンポーネントをローカル サーバーのドメイン名前空間にマッピングできるため、ProxyPass ディレクティブの機能が強化されます。

注: この機能を使用するには、mod_proxy モジュールを有効にする必要があります。

「パススルー | PT」(次のプロセッサに引き渡す)

このタグは、書き換えエンジンに内部 request_rec 構造体の uri フィールドをファイル名フィールドの値に設定するように強制します。この小さな変更により、RewriteRule ディレクティブの出力を Alias、ScriptAlias、リダイレクトおよびその他のディレクティブ。後続の処理用 [原文: Thisflagisjustahack toenablepost-processingoftheoutputofRewriteRuledirectives,usingAlias,ScriptAlias,Redirect,andotherdirectivesfromvariousURI-to-filenametranslators]。その意味を説明する例を挙げると: /abc を /def に書き換えてから、mod_alias を使用して /def を /ghi に変換する場合は、次のようにすることができます:

RewriteRule^/abc(.*)/def$1[PT]

エイリアス/def/ghi

PTタグを省略した場合、uri=/abc/…をfilename=/def/…に書き換える部分は正常に動作しますが、後続のmod_aliasでURIをファイル名に変換しようとすると失敗します。

注: URI をファイル名に変換する複数のモジュールを混在させる必要がある場合は、このタグを使用する必要があります。 。ここでの mod_alias と mod_rewrite の混合は典型的な例です。

‘qsappend|QSA’(クエリ文字列を追加)

このフラグは、書き換えエンジンに既存の置換文字列を単純に置き換えるのではなく、クエリ文字列を強制的に追加させます。書き換えルールを通じてリクエスト文字列に情報を追加する必要がある場合は、このタグを使用できます。

「redirect|R[=code]」(強制リダイレクト)

置換が http://thishost[:thisport]/ で始まる場合 (新しい URL を URI にする)、外部リダイレクトを強制できます。コードが指定されていない場合、HTTP 応答コード 302 (Temporary Move) が生成されます。 300 ~ 400 の範囲の別の応答コードを使用する必要がある場合は、ここで指定するだけです (または、次のシンボリック名のいずれかを使用します: temp (デフォルト)、permanent、seeother)。これを使用して、「/~」を「/u/」に書き換えたり、/u/user に常にスラッシュを追加したりするなど、正規化された URL をクライアントにフィードバックします。

注: このタグを使用する場合は、置換フィールドが有効な URL であることを確認する必要があります。そうしないと、無効な場所を指すことになります。また、このタグ自体は URL の先頭に http://thishost[:thisport]/ を付けるだけであり、書き換え操作は続行されることに注意してください。多くの場合、書き換え操作を停止してすぐにリダイレクトする必要があるため、「L」タグも使用する必要があります。

「skip|S=num」(後続のルールをスキップ)

このタグは、書き換えエンジンに現在の一致ルールの後の num 個のルールを強制的にスキップさせます。 if-then-else 構造をシミュレートできます。最後のルールは then 節であり、skip=N ルールは else 節です。注: これは、「chain|C」タグとは異なります。

「type|T=MIME-type」(必須の MIME タイプ)

ターゲット ファイルの MIME タイプを MIME タイプに強制します。これは、特定の条件に基づいてコンテンツ タイプを強制するために使用できます。たとえば、次のコマンドでは、.phps 拡張子を付けて呼び出した場合に、PHP ソース コード (application/x-httpd-php-source) の MIME タイプに従って mod_php で .php ファイルを表示できます。

RewriteRule^(.+.php)s$$1[T=application/x-httpd-php-source]

【Apacheサーバー変数:】

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477293.html技術記事 htaccess 構文のチュートリアル Apache サーバーの疑似静的ルールのチュートリアル 注: Discuz! フォーラムで静的ルールを探している場合は、ここを参照する必要はありません。Discuz!...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。