如何将重写从高级.htaccess转换为nginx conf规则

时间:2016-05-05 17:54:42

标签: apache .htaccess url nginx url-rewriting

最近从Apache切换到nginx。这在apache下很好用,但不知道如何为nginx添加它。尝试过htaccess到nginx转换器,但是它们让我重定向循环。

我在根目录中有WordPress,在子目录下有自定义代码。

这是Apache上正在运行的.htaccess文件:

# rewrite engine on and setting up base
RewriteEngine On
RewriteBase /leffa/

# replace + with _
RewriteRule ^(.+?)\+(.+)$ $1-$2 [R=301,L,NE]

# external redirect from action URL to pretty one
RewriteCond %{THE_REQUEST} /index(?:\.php)?\?q=([^\s&]+)&(kuvauksesta)= [NC]
RewriteRule ^ %1/%2? [R=302,L,NE]

RewriteCond %{THE_REQUEST} /index(?:\.php)?\?q=([^\s&]+)\s [NC]
RewriteRule ^ %1? [R=302,L,NE]

# skip all files and directories from rewrite rules below
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

# internal forward from pretty URL to actual URL (extra parameter)
RewriteRule ^([^/.]+)/([^/.]+)?$ index.php?q=$1&$2=1 [L,QSA]

# internal forward from pretty URL to actual URL
RewriteRule ^(.+)/?$ index.php?q=$1 [L,QSA]

这会将http://www.rollemaa.org/leffa/index.php?q=the+boy等所有网址重写为http://www.rollemaa.org/leffa/the-boy之类的网址。

情况是,我的主文件设置如下:

server {
listen 80;

access_log /var/log/nginx/rollemaa.access.log;
error_log /var/log/nginx/rollemaa.error.log;

root /var/www/rollemaa.org/public_html;
index index.html index.htm index.php;

server_name rollemaa.org www.rollemaa.org;

include hhvm.conf; 
include global/wordpress.conf;

# Ensure requests for pagespeed optimized resources go to the pagespeed
# handler and no extraneous headers get set.
location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; }
location ~ "^/ngx_pagespeed_static/" { }
location ~ "^/ngx_pagespeed_beacon" { }

# Static File Caching
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
   expires 365d;
}

#location /leffa/ {
    #try_files $uri $uri/ /leffa/index.php?q=$args;

#rewrite ^/leffa/(.+?)\+(.+)$ /leffa/$1-$2 redirect;
    #rewrite ^/leffa/(.*)$ /leffa/%1/%2? redirect;
    #rewrite ^/leffa/(.*)$ /leffa/%1? redirect;
    #if (-e $request_filename){
    #    rewrite ^/leffa/([^/.]+)/([^/.]+)?$ /leffa/index.php?q=$1&$2=1 break;
    #}    
    #rewrite ^/leffa/(.+)/?$ /leffa/index.php?q=$1 break;
    #}
}

正如你所看到的,我已经注释掉了重写部分,因为它不起作用。

任何nginx大师都可以帮助我吗?非常感谢提前!

1 个答案:

答案 0 :(得分:0)

您可以使用以下重写规则。

location /leffa/ {
    index index.php index.html;
    rewrite ^/leffa/([^/]*)/?$ /leffa/index.php?q=$1;
}

它会将/ leffa / the-boy /和/ leffa / the-boy等网址重写为/leffa/index.php?q=the-boy。具有子子目录的URL(例如/ leffa / the-boy / something-here)将被忽略。

注意:URL中的+不会转换为空格(就像直接访问/leffa/index.php?q=the+boy时一样)。访问/ leffa / the + boy /将导致查询参数q为" +男孩"。

如果要在查询字符串中使用空格,则必须使用%20 URL编码格式作为空格。 / leffa /%20boy和/ leffa /%20boy /将导致查询参数q为"男孩"。