这是我的 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$
块已被删除,因此.php
URI 现在由该块处理location /
。
该location /
块将使用.html
和.php
扩展名重定向 URI(这与if
您原始配置中的两个块一致)。
该location /
块尝试了几个 URI,包括来自指令的列表index
(除了index.php
稍后处理的)。
请注意,$uri/
元素和index
指令不再使用。
最后的操作是调用命名的location @php
块来处理.php
文件index.php
。
到目前为止,其功能与您现有的配置类似。
修改location /somedirectory
了以下 URI 的行为somedirectory
。它允许.php
URI 通过在try_files
指令之前默默地删除扩展来保留其扩展。