2014-04-23 170 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