0

我花了很长时间在谷歌上寻找任何信息,并询问了一些人(在有人建议我这样做之前)。

下面是我的 nginx.conf 中无法正常工作的部分。工作原理:重写 BlogHome、Home 和 About。

什么不起作用 - 重写为 C_ReadBlogURL 和 C_ReadAllPosts 。出于某种原因,这两个都是 404,即使路径是正确的。我不明白为什么——而且我整天都在为这个困惑。我认为这可能与它们是 php 文件有关,但我不知道。

任何帮助将不胜感激 :)

server {
listen   80;


server_name blog.example.com;

root /usr/share/nginx/www/example;
index /views/Read/BlogHome.php;


location / {
    rewrite ^/?$ /views/Read/BlogHome.php last; break;
    rewrite ^/(.+)/?$ /controllers/read/C_ReadBlogURL.php?url=$1 last; break;
}
location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}
}

server {
listen 80;
server_name example.com;

root /usr/share/nginx/www/example;
index /controllers/read/C_ReadLatestPost.php;

location ~ ^(/posts\.php) {
    rewrite ^(/posts\.php)  /controllers/read/C_ReadAllPosts.php?type=$arg_type last; break;
}

location ~ ^/?$ {
    rewrite ^/?$ /controllers/read/C_ReadLatestPost.php last; break;


}

location ~ ^(/about)/?$ {
    rewrite ^(/about)/?$ /views/Read/About.php last; break;
}

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

}
4

2 回答 2

0

() 在第一条规则中不是必需的,但这只是一个细节。

我认为你的问题是“break;”,只有“last;” 是本案的正确选择。

我试过这个并且它有效(test1.html 和 test2.html 有不同的内容,我知道何时输入每个规则):

rewrite ^/posts.php /test1.html?type=$arg_type last;
rewrite ^/(.+)/?$ /test2.html?url=$1 last;

所以,对你来说,这应该工作:

rewrite ^/posts.php /controllers/read/C_ReadAllPosts.php?type=$arg_type last;
rewrite ^/(.+)/?$ /controllers/read/C_ReadBlogURL.php?url=$1 last;

或根据您的上次更新:

rewrite ^/posts\.php /controllers/read/C_ReadAllPosts.php?type=$arg_type last;
rewrite ^/?$ /views/Read/BlogHome.php last;
rewrite ^/(.+)/?$ /controllers/read/C_ReadBlogURL.php?url=$uri last;
于 2013-04-11T22:53:43.627 回答
0

删除每一个“休息”;在您的每个重写规则中。它不属于这里。第一次“break;”之后的任何重写规则;指令将被忽略。不要认为那是你想要的。

参考:http ://wiki.nginx.org/HttpRewriteModule#break

[更新]基于下面评论中的 nginx 配置文件。

请注意,“ break 指令与“rewrite...break;”不同,我的主要更改是将 2 条规则移动到 php 位置块中,并将 'last' 替换为 'break',这样它就不会触发另一轮位置搜索。

您的第二个重写规则是错误的(在正则表达式中使用“[]”与“()”不同)。我的理解是你想匹配所有剩余的 php 脚本。所以我改变了这个规则。

我还删除了“break”的另一个外观;从“位置/”块。您可能只想放一个“休息”;IF 块内的指令。除此之外,我看不到该指令的任何实际用法。

[ UPDATE2 ] 将所有内容也移动到“位置/”块也是有意义的。

server {
    listen 80;
    server_name blog.example.com;
    root /usr/share/nginx/www/example;
    index /views/Read/BlogHome.php;

    location / {
        rewrite ^(/posts\.php) /controllers/read/C_ReadAllPosts.php?type=$arg_type break;
        rewrite ^/?$ /views/Read/BlogHome.php break;
        rewrite ^ /controllers/read/C_ReadBlogURL.php?url=$uri break;

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
   }
}
于 2013-03-31T23:54:10.257 回答