题 在nginx中缺少尾部斜杠时添加尾部斜杠


我正在使用此配置在Nginx上运行Magento: http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/configuring_nginx_for_magento

现在我想要301所有URL,而不是斜杠到包含尾部斜杠的对应的斜杠。例如:/ contacts to / contacts /。

我已经尝试了几乎所有的nginx指令,但是无济于事。例如,指定的指令 nginx-用尾随斜杠重写URL 导致重定向到/index.php/。

我应该添加哪个指令?


5
2017-10-29 19:16






答案:


我找到了解决方案:我在“location /” - 块中的“try_files”指令上面添加了以下行:

rewrite ^([^.]*[^/])$ $1/ permanent;

这是神奇的。


6
2017-10-30 08:40



你能详细介绍一下正则表达式的行为吗? - DanCat
@DanCat类似于“任意数量的非句号字符组,后面没有斜线” - helb


这非常非常棘手,因为您必须考虑网址中的所有可能性。让我们仔细看看您在那里发布的配置,并在尝试实现您的愿望时对其进行优化。我必须更正完整的配置,因为它对您的网站包含多个安全风险(并在配置后继续阅读)。

server {
    server_name    DOMAIN.com;
    return         301 $scheme://www.$server_name$request_uri;
}

server {
    index          index.html index.php;
    listen         80 default;
    root           /var/www;
    server_name    www.DOMAIN.com;

    location / {

        # Hide ALL kind of hidden stuff.
        location ~ /\. {
            return 403;
        }

        # Protect Magento's special directories in document root.
        location ~* ^/(app|includes|lib|media/downloadable|pkginfo|report/config\.xml|var)/? {
            return 403;
        }

        # Directly deliver known file types.
        location ~* \.(css|gif|ico|jpe?g|js(on)?|png|svg|webp)$ {
            access_log      off;
            add_header      Cache-Control   "public";
            add_header      Pragma          "public";
            expires         30d;
            log_not_found   off;
            tcp_nodelay     off;
            try_files       $uri =404;
        }

        # Do not allow direct access to index.php
        location ~* ^(.*)index\.php$ {
            return 301 $1;
        }

        # Extremely risky ... oh boy!
        location ~* \.php/ {
            rewrite ^(.*\.php)/ $1 last;
        }

        # Not direct index.php access and not one of those ultra
        # risky php files with a path appended to their script name,
        # let's try to add a slash if it's missing.
        location ~* ^(.*)[^/]+$ {
            return 301 $1/;
        }

        location ~* \.php$ {
          include          fastcgi_params;
          fastcgi_index    index.php;
          fastcgi_param    PATH_INFO          $fastcgi_path_info;
          fastcgi_param    PATH_TRANSLATED    $document_root$fastcgi_path_info;
          fastcgi_param    SCRIPT_NAME        $fastcgi_script_name;
          fastcgi_param    SCRIPT_FILENAME    $document_root$fastcgi_script_name;
          fastcgi_param    MAGE_RUN_CODE      "default";
          fastcgi_param    MAGE_RUN_TYPE      "store";
          fastcgi_pass     127.0.0.1:9000;

          # Ensure it's an actual PHP file!
          try_files        $uri =404;
        }
    }

    location ^~ /var/export/ {
        auth_basic              "Restricted";
        auth_basic_user_file    htpasswd;
        autoindex               on;
    }
}

重要!重要!重要!重要!

我无法测试这种配置,我已经把它写成了我最好的知识。请执行 nginx -t 在尝试之前 reload 你的nginx并报告,如果这报告任何错误。我再说一遍,不要在你的生产现场测试这个并测试你能想到的一切。


1
2017-10-29 22:30



谢谢你的回答,但这并没有解决我的问题。 - vincent.io