这是我的nginx站点configuration:
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”。
build议的解决scheme(只显示位置块):
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 /块将redirect.html和.php扩展名的URI(这与您原始configuration中的两个if块是一致的)。
location /块尝试几个URI,包括来自index指令的列表(除了稍后处理的index.php外)。
请注意, $uri/ element和index指令不再使用。
最后的动作是调用命名的location @php块来处理.php和index.php文件。
到目前为止,function与您现有的configuration类似。
location /somedirectory修改location /somedirectory的URI的行为。 它允许.php URI通过在try_files指令之前静静地移除它来保留它们的扩展。