2013-08-17 2 views
0

Я новичок в NGINX и ужасно с регулярными выражениями. Это то, что мне нужно:
правила перезаписи, что:
Правило перезаписи NGINX с исключениями

  • Маски mysite.com/SOMETHING над mysite.com/profile.html?id=SOMETHING
  • СНИМАЕТ mysite.com/images/ (и что-нибудь в этом каталоге) от этого переписывания
  • СНИМАЕТ mysite.com/ (корневой каталог) от перезаписи
  • СНИМАЕТ mysite.com/ANOTHERFILE.html (или .php) от перезаписи
  • Я сделал много прибегая к помощи и, похоже, не может найти то, что мне нужно. Даже статья поддержки, в которой рассказывается больше о nginx, используется regex. Это было мое лучшее предположение:

    location/{ 
        rewrite ^(?!(/images/))(.*)$ profile.html?id=$2 break; 
        return 403; 
    } 
    

    Я положил это в свой файл nginx.conf. Это сработало. Он переписал бы любой запрос, такой как mysite.com/SOMETHING, до mysite.com/profile.html?id=SOMETHING, однако он также переписал бы mysite.com/ на номер mysite.com/profile.html?id=. Кажется, что работа/images/exclusion работала (по мере того, как мои изображения загружались должным образом), однако даже переход в mysite.com/index.html будет переписан на mysite.com/profile.html?=id=index.html.

    Любая помощь была бы принята с благодарностью.

    +0

    Я недостаточно знаком с NGINX, чтобы дать вам правильный ответ, но похоже, что вы можете использовать ['try_files'] (http://wiki.nginx.org/HttpCoreModule#try_files), чтобы вы только переписывайте URL-адреса, которые фактически не существуют в качестве файла. Например, 'index.html' существует как файл, поэтому URL-адрес не следует переписывать. Я бы сказал, что это может даже покрыть ваш случай 'images', так как если существует _directory_, он не должен переписываться. –

    ответ

    0

    Я нашел решение, которое работает, но я подозреваю, что совпадение регулярных выражений поглощает некоторое время процессора и, возможно, замедляет работу моего сайта. Я буду продолжать поиски улучшенных решений, но вот как я в конечном итоге решение проблемы:

    #Location routing for user accounts 
    location =/{ 
    break; 
    } 
    
    location/{ 
        rewrite ^(?!(/images/|(.*\..*)))(.*)$ /profile.html?id=$2 break; 
        rewrite ^(.*)$ $1 break; 
        return 403; 
    } 
    #end location routing for user accounts 
    

    Я положил, что внутри блока server { } моего nginx.conf файла. Первый блок, location =/ { }, проверяет, является ли местоположение / (веб-корневым каталогом) и ТОЛЬКО /, затем ничего не делайте, чем обычная работа сервера, а затем это должно избежать всей обработки местоположения/перезаписи URL.

    Далее блок location/{ соответствует любому URI в веб-корне. Вот где входит rewrite и соответствие регулярному выражению.Во-первых, механизм перезаписи пытается сопоставить URI с регулярным выражением ^(?!(/images/|(.*\..*)))(.*)$, что требует, чтобы URI не начинался с /images/ ИЛИ file.ext (что-либо в этом формате), а затем берет любое слово, (.*) и затем перебрасывает его в перезаписанный URL-адрес url переписывает перерывы и сервер обслуживает страницу.

    Если нет матча в URI для регулярного выражения, например, URI = /images/arrow.png или URI = /folder/ или URI = /profile.php, то он переходит к следующему правилу. Следующее правило просто берет ваш URI и переписывает один и тот же URI. Я не могу говорить об эффективности этой тактики, тем более, что вы никогда не достигнете заявления return 403;, я чувствую, что, возможно, есть лучший способ сделать это. Я пробовал использовать try_files, но у меня не было большого успеха. Сейчас это работает и соответствует моим критериям. Кажется, что у вас мало производительности, но мне придется жить с ним, пока не смогу сделать улучшения.

    0

    Ну, я думаю, что одно правило может справиться со всем этим, но я возьму пару вещей, и вам нужно это подтвердить.

    для корневого каталога есть более index.php для/изображений и /file.html я буду считать, что эти файлы существуют с точным путем и служить им, я объясню более после того, как я пишу правило

    server { 
        server_name mydomain.com; # maybe www.mydomain.com too 
        index index.php; # or index.html, depending on ur app structure 
        location ~ /(.*) { 
         try_files $uri $uri/ /index.html?profile=$1; 
        } 
    } 
    

    /images/image.png и file.php/file.html все будет соответствовать первым правилом $uri, корень будет служить index.php (не очень точно, хотя), и когда все выходит из строя (как ваш /something URL, он будет попробовать /index.html?profile=something

    ps: Я бы использовали $request_uri вместо $1, но он включает в себя первый /, поэтому он будет оценивать /index.html?profile=/something, и я предполагаю, что это не сработает с вашим кодом.

    +0

    Экспедитор 'try_files', похоже, не работал для меня по какой-то причине, когда я пробовал это раньше. Я буду играть с этим предложением и посмотреть, будет ли он работать лучше, чем мое текущее решение. Я отправлю это как ответ. –

    +0

    , есть ли ошибка 500? или неправильный ответ? и что это за журнал ошибок, если есть ошибка –

    Смежные вопросы