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