Nginx Rewrite ルール関連の命令
Nginx Rewrite ルール関連の命令には、if、rewrite、set、return、break などが含まれますが、その中で rewrite は最も重要な命令です。単純な Nginx Rewrite ルールの構文は次のとおりです:
rewrite ^/b/(.*).html /play.php?video=$1 Break;
if ステートメントを追加する場合の例は次のとおりです:
if (!- f $request_filename)
rewrite ^/img/(.*)$ /site/$host/images/$1 last;
Nginx と Apache の Rewrite ルールの例の比較
大きな違いはありません単純な Nginx と Apache の書き換えルールの間では、基本的に完全に互換性があります。例:
Apache 書き換えルール:
RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]
RewriteRule ^/ceshi/$ /zl/ceshi.php [L] ]
RewriteRule ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [L]
RewriteRule ^/pingce([0-9]*) ) /$ /zl/pingce.php?id=$1 [L]
Nginx 書き換えルール:
rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;
rewrite ^ / ceshi/$ /zl/ceshi.php last;
rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last;
rewrite ^ /pingce([0-9]*)/$ /zl/pingce.php?id=$1 last;
上記の例からわかるように、Apache の Rewrite ルールは Nginx の Rewrite ルールに変更されます。シンプル: Apache の RewriteRule ディレクティブは Nginx の rewrite ディレクティブに置き換えられ、Apache の [L] タグは Nginx の最後のタグに置き換えられ、中間の内容は変更されません。
Apache の書き換えルールを Nginx の書き換えルールに変更し、nginx -t コマンドを使用して nginx.conf 設定ファイルに構文エラーがあることを確認した場合は、条件に引用符を追加してみてください。たとえば、次の Nginx Rewrite ルールは構文エラーを報告します:
rewrite ^/([0-9]{5}).html$ /x.jsp?id=$1 last;
引用符を追加すると、正解です:
rewrite “^/([0-9]{5}).html$” /x.jsp?id=$1 last;
Apache と Nginx の書き換えルールには、URL がジャンプするときの微妙な違いがあります:
Apache 書き換えルール :
RewriteRule ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301,L]
Nginx 書き換えルール :
rewrite ^/html/tagindex/ ([a -zA-Z]+)/.*$ http://$host/$1/ Permanent;
上記の例では、「http://$host」が置換文字列に追加されていることに気付きました。 Nginx Rewrite ルール。これは Nginx で必要です。
さらに、Apache と Nginx の書き換えルールは変数名も異なります。例:
Apache 書き換えルール:
RewriteRule ^/user/login/$ /user/login.php?login=1&forward=http: //% {HTTP_HOST} [L]
Nginx 書き換えルール:
rewrite ^/user/login/$ /user/login.php?login=1&forward=http://$host last;
Apache の一部の機能とNginx の書き換えルール 同一または類似の命令とタグの対応:
Apache の RewriteCond 命令は Nginx の if 命令に対応し、
Apache の [R] タグは Nginx のリダイレクト タグに対応します。 ] マークは Nginx の最後のマークに対応し、
Apache の [R, L] マークは Nginx のリダイレクト マークに対応し、
Apache の [PT, L] マークは Nginx の最後のタグに対応します。
指定されたドメイン名によるこのサイトへのアクセスを許可します。他のドメイン名は http://www.aaa.com
Apache 書き換えルール:
RewriteCond %{HTTP_HOST} ^(.*?).domain にジャンプします。 RewriteCond %{HTTP_HOST} !^qita.domain.com$
RewriteCond %{DOCUMENT_ROOT}/market/%1/index.htm -f
RewriteRule ^/wu/$ /market/%1/index.htm [ L]
Nginx の if 命令はネストをサポートしておらず、AND や OR などの複数の条件一致をサポートしていません。ただし、次のページの Nginx の設定記述方法でこれを実現できます。 :
Nginx 書き換えルール:
if ($host ~* ^(.*?).domain.com$) set $var_wupin_city $1;
Set $var_wupin '1′;
if ($host ~* ^qita . domain.com$)
set $var_wupin '0';
if (!-f $document_root/market/$var_wupin_city/index.htm)
set $var_wupin '0';
if ($var_wupin ~ ' 1')
rewrite ^/wu/$ /market/$var_wupin_city/index.htm last;
}
rewrite の構文
構文:
正規表現置換フラグを書き換える
デフォルト:
none
スコープ:
server, location, if
このディレクティブは、正規表現と置換文字列に従って URI を変更します。ディレクティブは、設定ファイル内の出現順に実行されます。
このディレクティブは、正規表現と置換文字列 URI を変更するか、文字列を変更します。命令は構成ファイル内の順序に従って実行されます。
書き換え正規表現は絶対 URL ではなく相対パスのみに一致することに注意してください。ホスト名と一致させたい場合は、次のような if 条件を使用する必要があります。
書き換え正規表現は相対パスに対してのみ機能することに注意してください。ホスト名をペアにする場合は、if ステートメントを使用する必要があります。
rewrite はパス部分を書き換えるだけで、ユーザーの入力パラメータは変更しません。したがって、ここでの if ルールでは、ユーザーがブラウザに入力したパラメータは書き換え後に自動的に追加されます。したがって、「Got one?」を追加するだけです。いいえ、後で必要になる小さなパラメーター ***https=1。
nginx 書き換えルールのリファレンス:
- ~ は大文字と小文字を区別するマッチング
- ~* は大文字と小文字を区別しないマッチング
- !~ と !~* はそれぞれ大文字と小文字を区別する不一致と大文字と小文字を区別しない不一致
- -f と !-f は、ファイルが存在するかどうかを判断するために使用されます
- -d と !-d は、ディレクトリが存在するかどうかを判断するために使用されます
- -e と !-e は、ファイルまたはディレクトリが存在するかどうかを判断するために使用されます
- -x と !-x は、ファイルが実行可能かどうかを判断するために使用されます
- last は、Apache の書き換え完了を示す [L] マークに相当します (笑) 最も一般的に使用されるはずです
- break 一致を終了し一致しなくなる 次のルール
- redirect return 302 一時的なリダイレクト アドレス バーにはジャンプ後のアドレスが表示されます
- permanent return 301 永久的なリダイレクト アドレス バーにはジャンプ後のアドレスが表示されます
- $args
- $content_length
$content_type- $document_root
- $document_uri
- $host
- $http_user_agent
- $http_cookie
- $limit_rate
- $request_body _file
- $request_method
-
$remote_addr- $リモートポート
- $remote_user
- $ request_filename
- $request_uri
- $query_string
- $scheme
- $server_protocol
- $server_addr
- $server_name
- $server_port
-
$uri-
QeePHPの組み合わせ例
if (!-d $request_filename) {- rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&c last;
-
書き換え ^/([a-z-A-Z] +)/?$ /index.php?namespace=user&c last;- break;
-
複数のディレクトリをパラメータに変換
abc.domian.com/sort/2 => ; abc.domian.com/index .php?act=sort&name=abc&id=2
if ($host ~* (.*).domain.com) {
- set $sub_name $1;
- rewrite ^/ sort/(d+)/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
- }
- ディレクトリ交換
/123456/xxxx -> /xxxx?id=123456
rewrite ^/(d+)/ (.+)/ /$2?id=$1 last;
- たとえば、次の設定 nginx は、ユーザーが ie を使用するときに /nginx-ie ディレクトリにリダイレクトします:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 Break;- }
-
- ディレクトリは自動的に「/」を追加します
if (-d $request_filename){
書き換え ^/(.* )([^/])$ http://$host/$1$2/ Permanent;- }
-
- htaccess allowed
location ~/.ht {
deny all;- }
-
-
複数のディレクトリを禁止
location ~ ^/(cron|templates)/ {
deny all;- break;
- }
-
- /dataで始まるファイルを禁止
複数レベルのディレクトリの下で .log.txt などの /data/ リクエストを禁止できます。 .txt リクエスト
location /searchword/cron/ {
すべて拒否;- }
-
- 個々のファイルを禁止
location ~ /data/sql/data.sql {
すべて拒否;
- }
-
- favicon .ico と robots.txt の有効期限を設定します。
favicon.ico は 99 日、robots.txt は 7 日間で、404 エラー ログは記録されません
location ~(favicon .ico) {
ログが見つかりません;-
有効期限 99 日;- 休憩;
- }
場所 ~(robots.txt) {
ログが見つかりません オフ;- 有効期限 7 日;
-
休憩;- }
-
- ファイルを設定します。有効期限は 600 秒で、アクセス ログは記録されません
- location ^~ /html/scripts/loadhead_1.js {
- access_log off;
- root /opt/ Lampp/htdocs/web;
- expires 600;
- break;
}
ファイルのホットリンク防止と有効期限の設定
ここで返される 412 はカスタム http ステータス コードで、デフォルトは 403 で便利です正しいホットリンク要求を見つけるため- 「^/ http://leech.divmy.com/leech.gif;」を書き換えます
アンチホットリンク画像を表示します- "access_log off;" アクセスログを記録しないでください
"有効期限は 3 日です" 3 日間のすべてのファイルのブラウザ キャッシュ -
- location ~* ^.+.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
- valid_referers ブロックされていない *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194 ;
- if ($invalid_referer) {
- rewrite ^/ http://leech.divmy.com/leech.gif;
- return 412;
- break;
- }
- access_log off;
- root /opt /lampp/htdocs/web;
- expires 3d;
- break;
- }
固定IPのみにWebサイトへのアクセスを許可し、パスワードを追加してください
- root /opt/htdocs/www;
- allow 208.97.167.194;
- allow 222.33.1.2;
- allow 231.152.49.4;
- すべて拒否;
- auth_basic “C1G_ADMIN”;
- auth_basic_user_file htpasswd ;
複数レベルのディレクトリ内のファイルを 1 つのファイルに変換します。 SEO 効果を高める
/job-123-456-789.html は /job/123/456/789.html を指します
- rewrite ^/job-([0-9]+)-([0-9] +)-([0-9]+).html$ /job/$1/$2/jobshow_$3.html last;
ルート ディレクトリ内のフォルダーを第 2 レベルのディレクトリ
(/shanghaijob/ など) にポイントします。 / area/shanghai/
last を Permanent に変更すると、ブラウザのアドレス バーに /location/shanghai/
- rewrite ^/([0-9a-z]+)job/(.*)$ / が表示されます。 area/$1/$2 last;
上記の例の問題は、/shanghai
- rewrite ^/([0-9a-z]+)job$ /area/$1 にアクセスすると一致しないことです。 / last ;
- rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;
このようにすると、/shanghai にもアクセスできますが、ページ内の相対リンクは使用できません。
たとえば、./list_1.html の実際のアドレスは /area/shanghia/list_1.html ですが、これは /list_1.html になり、アクセスできなくなります。
それでは自動ジャンプを追加するとうまくいきません
(-d $request_filename) 実ディレクトリでなければならないという条件がありますが、私の書き換えはそうではないので効果はありません
- if (- d $request_filename) {
- rewrite ^/(.*)([^/])$ http://$host/$1$2/ Permanent;
- }
理由が分かれば簡単ですが、手動でジャンプさせてください
- rewrite ^/([0-9a-z]+)job$ /$1job/ Permanent;
- rewrite ^/([0-9a-z]+)job/(.*) $ /area/ $1/$2 last;
ファイルとディレクトリが存在しない場合にリダイレクト:
- if (!-e $request_filename) {
- proxy_pass http://127.0.0.1;
- }
ドメイン名ジャンプ
- server
- {
- listen 80;
- server_name Jump.88dgw.com;
- indexindex.htmlindex.htmindex.php;
- root/opt/lampp/htdocs /www;
- 書き換え ^/ http://www.88dgw.com/;
- access_log off;
- }
複数のドメイン名のリダイレクト
- server_name www.7oom.com/ www.divmy. com/;
- indexindex.htmlindex.htmindex.php;
- root /opt/lampp/htdocs;
- if ($host ~ “c1gstudio.net”) {
- rewrite ^(.*) http: //www. 7oom.com$1/ Permanent;
- }
第 3 レベルのドメイン名 Jump
- if ($http_host ~* “^(.*).i.c1gstudio.com$”) {
- 書き換え ^( .*) http://top.88dgw.com$1/;
- break;
- }
ドメイン名ミラー
- server
- {
- listen 80;
- server_name Mirror.c1gs tudio.com ;
- indexindex.htmlindex.htmindex.php;
- root/opt/lampp/htdocs/www;
- rewrite ^/(.*)http://www.divmy.com /$1 last;
- access_log off;
- }
サブディレクトリをミラーリングします
- location ^~ /zhaopinhui {
- rewrite ^.+ http://zph.divmy.com/ last;
- break ;
- }
discuz ucenter ホーム (ウチメ) rewrite
- rewrite ^/(space|network)-(.+).html$ /$1.php?rewrite=$2 last;
- rewrite ^/ (space| network).html$ /$1.php last;
- rewrite ^/([0-9]+)$ /space.php?uid=$1 last;
discuz 7 rewrite
- rewrite ^(.*)/archiver/((fid|tid)-[w-]+.html)$ $1/archiver/index.php?$2 last;
- rewrite ^(.*)/forum- ([0-9]+)-([0-9]+).html$ $1/forumdisplay.php?fid=$2&page=$3 last;
- rewrite ^(.*)/thread-([0-9] ]+)-([0-9]+)-([0-9]+).html$ $1/viewthread.php?tid=$2&extra=page%3D$4&page=$3 last;
- ^( を書き換えます。 *)/profile-(username|uid)-(.+).html$ $1/viewpro.php?$2=$3 last;
- rewrite ^(.*)/space-(username|uid)-(.+) .html$ $1/space.php?$2=$3 last;
- 構成を説明するために ^(.*)/tag-(.+).html$ $1/tag.php?name=$2 last;
を書き換えますセクションのドメイン名を個別に指定します
server_name bbs.c1gstudio.com news.c1gstudio.com;-
location = / {- if ($http_host ~ news.divmy.com$) {
- rewrite ^.+ http://news.divmy.com/forum-831-1.html last;
- break;
- }
- }
-
discuz ucenter アバター書き換えの最適化
location ^~ /ucenter {- location ~ .*.php?$
- {
- #fastcgi_pass unix:/tmp/php-cgi.sock;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_indexindex.php;
- fcgiを含みます。 conf;
-
}-
location /ucenter/data/avatar {- log_not_found off;
- access_log off;
- location ~ /(.*)_big.jpg$ {
- error_page 404 /ucenter/images /noavatar_big.gif;
- }
- location ~ /(.*)_middle.jpg$ {
- error_page 404 /ucenter/images/noavatar_middle.gif;
- }
- location ~ /(.*)_small.jpg $ {
-
error_page 404 /ucenter/images/noavatar_small.gif;- }
- 期限切れ 300;
- break;
- }
- }
-
jspace rewrite
場所 ~ .*.php? $- {
- #fastcgi_pass unix:/tmp/php-cgi.sock;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index Index.php;
- include fcgi.conf;
- }
-
-
location ~* ^/index.php/- {
- rewrite ^/index.php/(.*) /index.php?$1 Break;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_indexindex.php;
-
include fcgi .conf;- }
-
さらに、Apacheルールをnginxルールに直接変換できるツールもありますhttp://www.anilcetin.com/convert-apache-htaccess-to-nginx /参考:http://wiki.nginx.org/NginxChsHttpRewriteModulehttp://blog.csdn.net/cnbird2008/archive/2009/08/04/4409620.aspxhttp:// www.divmy.com/
上記では、Nginx 設定ファイルと ReWriteUrl~ に関するいくつかのことを、関連する内容も含めて紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。