2013-08-08 4 views
2

У нас есть страничные кэши с разделением id и поддоменом. Скажем, для запросов как ny.site.com/cat/12345 или la.site.com/dog/234, Nginx нужноКак настроить nginx для try_files сначала, если не существует, следуйте request_uri

  1. проверки, если файл /cat/ny/1234/5.html существует, то вернуть его
  2. в противном случае, просто использовать оригинальный request_uri ударить сервер приложений, а кэш-файл будет создан

Нам удалось выяснить часть субдомена и раздела раздела id, но не получилось удачи в части try_files. Всегда получить неопределенные ошибки цикла как rewrite or internal redirection cycle while internally redirecting to

наш файл nginx.conf, как

rewrite "/cat/([0-9]{4})([0-9]{1,4})" /system/cache/cat/$subdomain/$1/$2.html break; 
rewrite "/cat/([0-9]{1,4})" /system/cache/cat/$subdomain/$1.html break; 
try_files $uri $request_uri; 

Любые намеки? Благодаря!

ОБНОВЛЕНИЕ: Я пробовал следующее. Nginx искал $ request_uri (например,/cat/12345) в файловой системе вместо того, чтобы поражать сервер приложений. Есть предположения?

try_files $uri @old; 
location @old { 
    rewrite^$request_uri break; 
} 

ответ

5

Попробуйте с этим

location ^~ ^/cat/([0-9]{4})([0-9]{1,4}) { 

    try_files "/cat/ny/$1/$2.html" @app_server; 

} 
location @app_server{ 

    # pass this to your app server for processing. 

} 
  1. Использование^~, так как это будет также включать край кейс подобный/кошка/12345/(завершение косая черта).
  2. И просто убедитесь, что вы хотите $ uri (который без строки запроса) или $ request_uri (который содержит строку запроса).
+0

, благодаря чему это вдохновляет. –

+0

@ surajs21: У меня есть ссылка на www.test.com/public/'и' www.test.com/public/web' и 'www.test.com/public/web1'. это ZF2. Я сталкиваюсь с проблемой, так как она правильно получает ссылку на первый URL-адрес «public /», но выдает «www.test.com/public/web» и «www.test.com/public/web1». ngin x не удается сопоставить его. Пожалуйста, помогите мне http://stackoverflow.com/questions/21377321/nginx-no-input-file-specified-php-fast-cgi –

0

Я никогда не пытался это мой сам раньше, но это, как я написал бы это

location/{ # or whatever location you see fit to your requirements 
    try_files $uri.html $uri; 
    # I don't know if the `.` needs to be escaped `$uri\.html`, you can try both 
} 
+0

спасибо за ввод, но я не понимаю. Как этот try_files решает проблему? т. е. когда $ uri не существует на диске, вернитесь к исходному $ request_uri? –

+0

'try_files' сообщает nginx, что попробовать для этого запроса, поэтому я просто говорю ему, чтобы посмотреть, есть ли у' $ uri' файл html для него, иначе попробуйте '$ uri', если у вас есть файл php, который обрабатывает запросы, тогда u должны передать это как 3-й параметр, например: '/ index.php $ request_uri', например –