Linux
nginx中的索引文件重定向
設想
我有一個具有以下結構的網站:
/index.html /about/index.html /contact/index.php /contact/send_email.php
我本來希望使 URL 更清晰,所以我將是等效的結構:
/ => /index.html /about/ => /about/index.html /contact/ => /contact/index.html /contact/send_email.php => /contact/send_email.php
基本上是從 URI中刪除所有
index.html
或文件名的 Nginx 配置。index.php
我嘗試的配置
server { listen 80; root /home/www/mysite; server_name www.mysite.com; location ^~* /[a-z]+/index\.(html|php)$ { rewrite ^(/[a-z]+/)index\.(html|php)$ http://www.mysite.com$1? permanent; } try_files $uri $uriindex.html $uriindex.php =404; location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php5.sock fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
問題
簡而言之 - 它不起作用。當我去
/about/index.html
它應該永久重定向到/about/
但它只是停留在/about/index.html
. 我已經測試了正則表達式,它們似乎很好 - 即重寫作品中定義的擷取組。
你用的是哪個版本的 nginx?
我用 nginx 1.4.2 嘗試了你的配置,它檢測到一些語法錯誤:
invalid location modifier "^~*"
在您的第一個location
指令中-我將其更改為~
unknown "uriindex" variable
在您的try_files
指令中-我將$uriindex.html
and更改$uriindex.php
為$uri/index.html
and$uri/index.php
在這一點上,我相信該設置可以滿足您的大部分需求:
- 去
www.mysite.com/about/index.html
你被重定向到www.mysite.com/about/
- 去
www.mysite.com/contact/index.html
你被重定向到www.mysite.com/contact/
- 不會
www.mysite.com/contact/send_email.php
發生重定向現在
www.mysite.com/index.html
要重定向到www.mysite.com/
,您需要另一個“位置”指令並重寫規則:location ~ /index\.html$ { rewrite ^/index\.html$ http://www.mysite.com permanent; }
至於
www.mysite.com/contact/
使用 PHP-FPM 作為www.mysite.com/contact/index.php
腳本執行,您還需要一個特定的位置指令。這裡的fastcgi_index index.php
行非常重要:location = /contact/ { include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php5.sock fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
希望這可以幫助 :)