我想重寫一個像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;
}
}
什麼辦法可以使重寫生效,而不是瀏覽器試圖訪問它永遠無法到一個文件?
你認爲指令'try_files $ uri $ uri/@help @ no-extension;'應該做什麼? –
我更習慣於重寫Apache,但我可以看到它可能是一個問題。但是,我無法刪除$ uri $ uri/part,或者網站因爲拒絕在「help」文件夾中加載index.php而中斷。 – Flawedspirit
爲了更直接地回答這個問題,我不知道。這只是其他位置塊的「工作」,我預計它也會在這裏。我急切地等待指導我出錯的地方。 (我不是諷刺,我的意思是說。) – Flawedspirit