nginx 中的索引文件重定向

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

基本上,Nginx 配置会从 URI 中删除所有index.html或文件名。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。我已经测试了正则表达式,它们似乎没问题 - 即重写中定义的捕获组有效。

答案1

您正在使用哪个版本的 nginx?

我已经使用 nginx 1.4.2 尝试了您的配置,并且检测到一些语法错误:

  1. invalid location modifier "^~*"在你的第一个location指令中 - 我将其改为~
  2. unknown "uriindex" variable在你的try_files指令中 - 我将和都$uriindex.html更改$uriindex.php$uri/index.html$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;
}

希望这可以帮助 :)

相关内容