Nginx 重写、重置重写或向特定目录添加扩展

Nginx 重写、重置重写或向特定目录添加扩展

这是我的 nginx 站点配置:

server {
server_name DOMAIN.COM;
access_log /srv/www/DOMAIN.COM/logs/access.log;
error_log /srv/www/DOMAIN.COM/logs/error.log;
root /srv/www/DOMAIN.COM/public_html;

location / {
    if ($request_uri ~ ^/(.*)\.html$) {  return 302 /$1;  }
    try_files $uri $uri/ $uri.html $uri.php?$args;
    index index.html index.htm index.php;
}

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    if ($request_uri ~ ^/([^?]*)\.php($|\?)) {  return 302 /$1$is_args$args;  }
    try_files $uri =404;
}

location @extensionless-php {
    rewrite ^(.*)$ $1.php last;
}

}

我该如何做才能使“domain.com/directory/”不重写任何 URL 并保留文件扩展名?例如,使“domain.com/directory/filename”和目录中的所有其他文件重写为“domain.com/directory/filename.php”,但在每个其他目录中删除“.php”。

答案1

建议的解决方案(仅显示位置块):

location ~ ./$ { rewrite ^(.*)/ $1 last; }

location / {
    if ($request_uri ~ ^(.*)\.(php|htm)) { return 302 $1$is_args$args; }

    try_files $uri $uri/index.html $uri/index.htm @php;
}

location @php {
    try_files $uri.php $uri/index.php =404;

    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass  127.0.0.1:9000;
}

location /somedirectory {
    rewrite ^(.*)\.php$ $1 break;

    try_files $uri $uri/index.html $uri/index.htm @php;
}

location ~ /$块会默默地删除任何尾随斜杠,因为这会干扰try_files以后的指令。

请注意,该location ~ \.php$块已被删除,因此.phpURI 现在由该块处理location /

location /块将使用.html.php扩展名重定向 URI(这与if您原始配置中的两个块一致)。

location /块尝试了几个 URI,包括来自指令的列表index(除了index.php稍后处理的)。

请注意,$uri/元素和index指令不再使用。

最后的操作是调用命名的location @php块来处理.php文件index.php

到目前为止,其功能与您现有的配置类似。

修改location /somedirectory了以下 URI 的行为somedirectory。它允许.phpURI 通过在try_files指令之前默默地删除扩展来保留其扩展。

相关内容