Вот конфигурация моего сайта 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».
Предлагаемое решение (показаны только блоки местоположения):
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 /
блок перенаправит URI с .html
и .php
расширение (что согласуется с двумя if
блоки из исходной конфигурации.
В location /
блок пробует несколько URI, включая список из index
директива (кроме index.php
который будет обработан позже).
Обратите внимание, что $uri/
элемент и index
директива больше не используется.
Последнее действие - вызвать названный location @php
блок для обработки .php
и index.php
файлы.
До этого момента функциональность аналогична вашей существующей конфигурации.
В location /somedirectory
изменяет поведение для URI ниже somedirectory
. Это позволяет .php
URI, чтобы сохранить свое расширение, молча удалив его до try_files
директива.