.htaccess重写为nginx配置

时间:2012-09-13 15:17:47

标签: url redirect nginx rewrite

需要帮助将.htaccess重写规则转换为nginx配置。规则来自metro shrink url shortner script。

RewriteEngine On 
#RewriteBase /

RewriteRule ^developer.html$            developer.php [QSA,L]
RewriteRule ^multishrink.html$          multishrink.php [QSA,L]
RewriteRule ^stats.html$                public-stats.php [QSA,L]
RewriteRule ^feed.rss                   feed.php [QSA,L]
RewriteRule ^([^/]+)\.qrcode$           qrcode.php?id=$1 [QSA,L]
RewriteRule ^api.php$                   API/simple.php [QSA,L]
RewriteRule ^API/write/(get|post)$      API/write.php?method=$1 [QSA,L]
RewriteRule ^API/read/(get|post)$       API/read.php?method=$1 [QSA,L]
RewriteRule ^([^/]+)/stats$             stats.php?id=$1 [QSA,L]
RewriteRule ^([^/]+)/unlock$            unlock.php?id=$1 [QSA,L]

# If path is not a directory or file then apply RewriteRule
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d        
RewriteRule ^([0-9a-zA-Z-]{1,60})$      go.php?id=$1 [QSA,L]

2 个答案:

答案 0 :(得分:0)

尝试:

location = /developer.html { 
   rewrite ^(.*)$ /developer.php break; 
} 

location = /multishrink.html { 
   rewrite ^(.*)$ /multishrink.php break; 
} 

location = /stats.html { 
   rewrite ^(.*)$ /public-stats.php break; 
} 

location /feed { 
   rewrite ^/feed.rss /feed.php break; 
} 

location / { 
   rewrite ^/([^/]+)\.qrcode$ /qrcode.php?id=$1 break; 
   rewrite ^/([^/]+)/stats$ /stats.php?id=$1 break; 
   rewrite ^/([^/]+)/unlock$ /unlock.php?id=$1 break; 
   if (!-e $request_filename){ 
      rewrite "^/([0-9a-zA-Z-]{1,60})$" /go.php?id=$1 break; 
   } 
} 

location = /api.php { 
   rewrite ^(.*)$ /API/simple.php break; 
} 

location /API { 
   rewrite ^/API/write/(get|post)$ /API/write.php?method=$1 break; 
   rewrite ^/API/read/(get|post)$ /API/read.php?method=$1 break; 
}

答案 1 :(得分:0)

以下应该可以解决问题:

location = /developer.html { rewrite ^ developer.php last; }
location = /multishrink.html { rewrite ^ multishrink.php last; }
location = /stats.html { rewrite ^ stats.php last; }

location ~ ^feed.rss { rewrite ^ feed.php last; }
location ~ ^([^/]+)\.qrcode$ { rewrite ^([^/]+)\.qrcode$ qrcode.php?id=$1 last; }

location = /api.php { rewrite ^ API/simple.php; }
location ~ ^API/(write|read)/(get|post)$ { 
  rewrite ^API/(write|read)/(get|post)$ API/$1.php?method=$2 last;     
} 

location ~ ^([^/]+)/stats$ { rewrite ^([^/]+)/stats$ stats.php?id=$id last;}

location ~ ^([^/]+)/unlock$ {
  set $id $1;
  rewrite ^ unlock.php?id=$id last;  
}

location ~ "^([0-9a-zA-Z-]{1,60})$" {
  try_files $uri $uri/ go.php?id=$1;
}

注意:您可以通过先保存它们(如解锁位置)重新使用位置正则表达式中的捕获,或者您可以重复正则表达式(需要保存来自重写指令重置的事实)捕获变量)。使用您喜欢的任何一种风格。

注意:默认情况下,nginx附加查询参数,因此来自apache的qsa标志基本上是默认值,来自http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite

 If a replacement string includes the new request arguments, the previous request 
 arguments are appended after them. If this is undesired, putting a question mark
 at the end of a replacement string avoids having them appended