2014-04-23 139 views
0

我想重写一个像http://example.com/extras/?cat=help&page=faq这样的网址到http://example.com/extras/help/faq的行。Nginx重写规则导致错误403

那么,重写在链接或用户键入后者,服务器明白,它应该是前者。但是,在实现了表面上应该做我想做的重写之后,导航到页面会生成403代码,因为服务器正在使用网址栏字面上的。因为我将服务器设置为禁止直接访问子文件夹,所以返回403代码。

下面是我的网站上,处理加载页面被列入/extras index.php文件中的PHP代码:

if(!empty($_GET['cat']) && !empty($_GET['page'])) { 
    $folder = $_GET['cat']; 
    $page = $_GET['page'] . '.php'; 
    $pages = scandir($folder); 
    unset($pages[0], $pages[1]); 

    $url .= $folder . DIRECTORY_SEPARATOR; 

    if(file_exists($url . $page) && in_array($page, $pages)) { 
    $url .= $page; 
    include($url); 
    } else { 
    //Invalid category or page given 
    header("HTTP/1.0 404 Not Found"); 
    } 
} else { 
    //No category or page given; fall back to contents 
    include("contents.php"); 
} 

上述文件的目的是为子文件的子文件夹中的内容包含在index.php的主体中,而不是让浏览器真正尝试并导航到子文件。

这是(部分)nginx的配置:

server { 
    listen 80 default_server; 
    listen [::]:80 ipv6only=on; 

    root /usr/share/nginx/html; 

    server_name localhost; 

    error_page 403 /; 
    error_page 404 /error/404.php; 
    error_page 500 502 503 504 /error/50X.php; 

    index index.html index.htm index.php; 

    location/{ 
    try_files $uri $uri/ @no-extension; 

    allow 192.168.0.0/24; 
    allow 127.0.0.1; 
    deny all; 
    } 

    location /help { 
    try_files $uri $uri/ @help @no-extension; 
    } 

    location @help { 
    rewrite "^/help/([^/]*)/([^/]*)$" /help/?cat=$1&page=$2 last; 
    } 

    location ~ /help/(help|otherfolder|morefolders) { 
    deny all; 
    } 

    # PHP Handler 
    location ~ \.php$ { 
    try_files $uri $uri/ =404; 

    include fastcgi_params; 
    fastcgi_pass php5-fpm-sock; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param QUERY_STRING $query_string; 
    fastcgi_intercept_errors on; 
    } 

    location @no-extension { 
    rewrite ^(.*)$ $1.php last; 
    } 
} 

什么办法可以使重写生效,而不是浏览器试图访问它永远无法到一个文件?

+0

你认为指令'try_files $ uri $ uri/@help @ no-extension;'应该做什么? –

+0

我更习惯于重写Apache,但我可以看到它可能是一个问题。但是,我无法删除$ uri $ uri/part,或者网站因为拒绝在“help”文件夹中加载index.php而中断。 – Flawedspirit

+0

为了更直接地回答这个问题,我不知道。这只是其他位置块的“工作”,我预计它也会在这里。我急切地等待指导我出错的地方。 (我不是讽刺,我的意思是说。) – Flawedspirit

回答

0

,而不是完全回答你的问题,岂不是更简单

location /help { 
    try_files $uri $uri/ /index.php; 

在加载/帮助/ /它传递给REQUEST_URI其中的index.php做后续的正则表达式拆分和文件包括: ...不需要重写。你想限制的特定位置块应该放置在上面,所以拒绝将首先匹配(如果我记得正确)

+0

如果URL是包含PHP参数的标准URL,则该网站可以很好地工作。我想要完成的是改变URL在浏览器栏中的显示方式,以及允许像http://example.com/folder/page这样的链接工作,因为我认为URL中的参数有点难看。也许我在你的解释中错过了一些东西? – Flawedspirit

+0

它对每个以/ help开头的URL都执行/index.php。 so/help/file/faq或/ help/otherfile/sub会在/ root中运行index.php,并且该php脚本可以找出您通过http头部REQUEST_URI输入的URL,这会给你上面的字符串,“/帮助/文件/常见问题”,或其他。仍然在PHP分裂/文件/和/常见问题/并继续你的脚本,因为它目前工作。 用户仍然会看到example.com/folder/page即使是其内部运行的example.com/index.php。 试图变得更清楚,更好吗? – pete

+0

是的,我想我确切地知道你在说什么。我会尽可能地尝试,并将其标记为已回答。 – Flawedspirit