У меня следующая конфигурация сервера:
server {
listen 80;
server_name mysite.proj;
location / {
root /path/to/mysite.proj/www;
index index.php index.html index.htm;
}
access_log /path/to/mysite.proj/data/logs/access.log;
error_log /path/to/mysite.proj/data/logs/error.log;
if (!-e $request_filename) {
rewrite ^(.+)$ /index.php last;
}
location ~ \.php$ {
root /path/to/mysite.proj/www;
fastcgi_pass 127.0.0.1:8081;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /path/to/mysite.proj/www$fastcgi_script_name;
include fastcgi_params;
}
}
server {
listen 80;
server_name www.mysite.proj;
rewrite ^/(.*) http://mysite.proj/$1 permanent;
}
Работает нормально, каждый url переписывается на index.php. Но в то же время каждый URL-адрес таблицы стилей, каждый URL-адрес javascript, каждый URL-адрес изображения также переписываются. Как написать правило перезаписи, чтобы не перезаписывать URL-адреса для файлов css, js, изображений?
У вас нет корневого набора в контексте сервера, где находится if, поэтому он использует значение по умолчанию <префикс установки> / html. Вы должны переместить корень в контекст сервера и отключить if для файла try_files. Кроме того, нет причин фиксировать запрос при перенаправлении без www, поскольку исходный запрос уже хранится в $ request_uri.
server {
listen 80;
server_name www.mysite.proj;
# Permanent redirect to no-www
return 301 http://mysite.proj$request_uri;
}
server {
listen 80;
server_name mysite.proj;
root /path/to/mysite.proj/www;
index index.php index.html index.htm;
access_log /path/to/mysite.proj/data/logs/access.log;
error_log /path/to/mysite.proj/data/logs/error.log;
location / {
# try_files does not preserve query string by default like rewrite
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
# If the requested file doesn't exist, and /index.php doesn't, return a 404
try_files $uri /index.php =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:8081;
}
}