2013-03-31 159 views
0

我花了很多年的时间在谷歌上搜索任何信息,并且问了一些人(在任何人建议我去之前)。Nginx重写404

我的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; 
} 

} 

回答

0

删除所有 “破发”;在你的每个重写规则中。它不属于这里。第一次“休息”后的任何重写规则指令将被忽略。不要以为这就是你想要的。

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

[UPDATE基于来自下面的评论nginx的配置文件。

请注意,“break directive与”rewrite ... break“不同;我的主要变化是将2个规则移动到php位置块中,并用'break'替换'last',使其不会触发另一轮到位置搜索。

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

我还从“位置/”块中删除了另一个“break”的外观,你可能只想放一个'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; 
    } 
} 
+0

您好 - 感谢您的回答。 重写^(/ posts.php)/controllers/read/C_ReadAllPosts.php?type=$arg_type last; break;重写^ /(。+)/?$ /controllers/read/C_ReadBlogURL.php?url=$1 last;打破; 如果我把任何一个放在前面 - 那么最上面的那个会工作,而下面的不会。如果我抽出时间,那么它默认为最后一个。我不知道发生了什么事情:( – user1438377

+0

我甚至让下面的规则更详细:[^ \。php] - 它仍然没有帮助。我不明白为什么两个规则不能一起工作。虽然 – user1438377

+0

您需要删除那些“break”,当然,请注意,您的第二个正则表达式匹配任何非空的uri,但第一个正则表达式只匹配给定的字符串“/posts.php”,所以我认为您的请求?可能没有“/posts.php”,在它的URI您使用的同时,跳出后,以测试规则,要求 –

0

的()是不是在第一个规则必要的,但是,这只是一个细节

我认为你的问题是“破;”,只有“最后,”是正确的选择。这个案例。

我试过了这个第二它的工作原理(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;