view xml/cn/docs/http/converting_rewrite_rules.xml @ 1878:127ae107e5a9

Removed clause about shared memory and Windows versions with ASLR. Starting with nginx 1.9.0 shared memory can be used on Windows versions with address space layout randomization.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 26 Dec 2016 19:38:06 +0300
parents 9934338f83af
children
line wrap: on
line source

<!--
  Copyright (C) Igor Sysoev
  Copyright (C) Nginx, Inc.
  -->

<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">

<article name="转换rewrite规则"
         link="/cn/docs/http/converting_rewrite_rules.html"
         rev="1"
         lang="cn">


<section name="重定向到主站">

<para>
共享站点的管理员,习惯于<i>只</i>在Apache下使用.htaccess文件配置<i>所有</i>信息,通常会将下面规则

<programlisting>
RewriteCond  %{HTTP_HOST}  example.org
RewriteRule  (.*)          http://www.example.org$1
</programlisting>

翻译成这样:

<programlisting>
server {
    listen       80;
    server_name  www.example.org  example.org;
    if ($http_host = example.org) {
        rewrite  (.*)  http://www.example.org$1;
    }
    ...
}
</programlisting>
</para>

<para>
这种做法是错的,复杂而且低效。正确的方式是为<literal>example.org</literal>定义一个单独的服务器:

<programlisting>
server {
    listen       80;
    server_name  example.org;
    return       301 http://www.example.org$request_uri;
}

server {
    listen       80;
    server_name  www.example.org;
    ...
}
</programlisting>

<note>
在0.9.1版本(含)以前,可以这样实现重定向:
<programlisting>
    rewrite      ^ http://www.example.org$request_uri?;
</programlisting>
</note>

</para>

</section>


<section>

<para>
再举一个例子,处理一个和刚才相反的逻辑:既不是来自<literal>example.com</literal>,又不是来自<literal>www.example.com</literal>:

<programlisting>
RewriteCond  %{HTTP_HOST}  !example.com
RewriteCond  %{HTTP_HOST}  !www.example.com
RewriteRule  (.*)          http://www.example.com$1
</programlisting>

应该按下面这样分开定义<literal>example.com</literal>、<literal>www.example.com</literal>和其他站点:

<programlisting>
server {
    listen       80;
    server_name  example.com www.example.com;
    ...
}

server {
    listen       80 default_server;
    server_name  _;
    return       301 http://example.com$request_uri;
}
</programlisting>

<note>
在0.9.1版本(含)以前,可以这样实现重定向:
<programlisting>
    rewrite      ^ http://example.com$request_uri?;
</programlisting>
</note>

</para>

</section>


<section id="converting_mongrel_rules"
        name="转化混合规则">

<para>
典型的混合规则如下:

<programlisting>
DocumentRoot /var/www/myapp.com/current/public

RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ %{DOCUMENT_ROOT}/system/maintenance.html [L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ $1 [QSA,L]

RewriteCond %{REQUEST_FILENAME}/index.html -f
RewriteRule ^(.*)$ $1/index.html [QSA,L]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1/index.html [QSA,L]

RewriteRule ^/(.*)$ balancer://mongrel_cluster%{REQUEST_URI} [P,QSA,L]
</programlisting>

转换成nginx配置应该是这样:

<programlisting>
location / {
    root       /var/www/myapp.com/current/public;

    try_files  /system/maintenance.html
               $uri  $uri/index.html $uri.html
               @mongrel;
}

location @mongrel {
    proxy_pass  http://mongrel;
}
</programlisting>
</para>

</section>

</article>