Linux

nginx中的索引文件重定向

  • September 17, 2013

設想

我有一個具有以下結構的網站:

/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 嘗試了你的配置,它檢測到一些語法錯誤:

  1. invalid location modifier "^~*"在您的第一個location指令中-我將其更改為~
  2. unknown "uriindex" variable在您的try_files指令中-我將$uriindex.htmland更改$uriindex.php$uri/index.htmland$uri/index.php

在這一點上,我相信該設置可以滿足您的大部分需求:

  1. www.mysite.com/about/index.html你被重定向到www.mysite.com/about/
  2. www.mysite.com/contact/index.html你被重定向到www.mysite.com/contact/
  3. 不會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;
}

希望這可以幫助 :)

引用自:https://serverfault.com/questions/539393