ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

301 redirect на URI без слэша на конце


  • To: nginx-ru@xxxxxxxxx
  • Subject: 301 redirect на URI без слэша на конце
  • From: Андрей Середенко <andrei.seredenko@xxxxxxxxx>
  • Date: Thu, 9 Jan 2014 17:55:57 +0300
  • Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:date:message-id:subject:to:content-type; bh=Ow0hYAb5shRcPbn+9eQGFNBGKcWAPtlYbUOmtXdyLbA=; b=m74f1qENfBvcknY2ob6/qidt3w8+D/spQa0onYqJS/+NESozETC7Y+YG52mocYlm7m ytuF80EsYWk2tcfo3Srp9/YwiUPWZwi47jgjWiZ1r0Ar85s12d/ed38kHNfylvunoBS9 l8P3PqSYv7txHB7AOff0e/9huG+PTsH94hEc4awAA4YiNpIFK6vgmeJ7Ah8E50Es0WNy jF4CAYh5A0IY19h2CREWcsMOCHsIJVWlao6sIdRVR91R2EKpJmPB7oZEuPuTWeyWpKN/ DIjPlCZBLtMLdNvOo5musQj9/9UVjhqQOSSMsf+g5B/1Rh+X5JfDWziFHF+0bPYTU5M6 k5RQ==

Здравия, друзья! Всех с прошедшими праздниками!

В процессе приведения конфигурации своих веб-серверов в более лицеприятный столкнулся с таким моментом: автоматическое добавление слэша не происходит после отрабатывания директивы try_files. Было неожиданно. Немного примеров, чтобы стало понятнее, о чем речь (ниже 2 фрагмента конфигурации - "до" и "после"):

location /webapp/ {
       proxy_pass         http://app_upstream;
include my-site/proxy_pass_params.conf;
}

Подумалось, что правильнее отдавать статику силами nginx'а, а не напрягать и без того кривое приложение:) В итоге, location принял следующий облик:

location /webapp/ {
root /var/www/webapps/nginx-static;
try_files $uri @application-handle;
}

location @application-handle {
       proxy_pass         http://app_upstream;
include my-site/proxy_pass_params.conf;
}

В результате, в принципе, получил то, что хотел: запрашиваемые файлы сначала ищутся в /var/www/webapps/nginx-static, и, если ничего не нашли, - проксируем на приложение. Но - перестали обрабатываться запросы вида http://my.site.com/webapp, хотя запросы http://my.site.com/webapp/ (со слэшем на конце) обрабатываются корректно.
Оно то, в общем-то, и правильно: в документации сказано:

Если location задан префиксной строкой со слэшом в конце и запросы обрабатываются при помощи proxy_pass, fastcgi_pass, scgi_pass, uwsgi_pass или memcached_pass, а в ответ на запрос с URI равным этой строке, но без завершающего слэша, будет возвращено постоянное перенаправление с кодом 301 на URI с добавленным в конец слэшом. Если такое поведение нежелательно, можно задать точное совпадение URI и location, например:
location /user/ {
    proxy_pass http://user.example.com;
}

location = /user {
    proxy_pass http://login.example.com;
}

Про try_files тут не сказано ни слова.) Но возник законный вопрос: а как вернуть прежнее поведение? можно ли сделать это "красиво"? или придется городить магию с реврайтами? а если писать реврайты - куда их пихать.. в общем, как-то так. Как-то сходу не получилось самому ответить на эти вопросы, решил поделиться с сообществом. Буду признателен за любые предложения выхода из ситуации.

Немного информации, которая может быть полезной:

[ root@app1 ~]# nginx -V
nginx version: nginx/1.0.15
built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --with-mail --with-mail_ssl_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-ld-opt=-Wl,-E

[ root@app1 ~]# lsb_release -a
LSB Version: :core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
Description: CentOS release 6.2 (Final)
Release: 6.2
Codename: Final

[ root@app1 ~]# uname -a
Linux app1 2.6.32-220.23.1.el6.x86_64 #1 SMP Mon Jun 18 18:58:52 BST 2012 x86_64 x86_64 x86_64 GNU/Linux

Содержимое my-site/proxy_pass_params.conf (роли наверняка не играет, но для полноты картины - надо):

proxy_redirect     off;

proxy_set_header   Host                   $host;
proxy_set_header   Remote-Addr       $remote_addr;
proxy_set_header   X-Real-IP            $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
proxy_set_header   X-Public-Url         http://$host$request_uri;

client_max_body_size                      40m;
client_body_buffer_size                    128k;

proxy_connect_timeout                    90;
proxy_send_timeout                        90;
proxy_read_timeout                         2600;

proxy_buffer_size                           4k;
proxy_buffers                                 4 32k;
proxy_busy_buffers_size                 64k;
proxy_temp_file_write_size              64k;

awaiting.. 
_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.