Один. Відповідність регулярних виразів, де: * ~ — це відповідність до регістру * ~* — це збіг без регістру * !~ та !~* — це невідповідності відповідно до регістру та невідповідності Два. Файл і каталог співпадають, де: * -f і !-f використовуються для визначення існування файлу * -d та !-d використовуються для визначення, чи існує каталог * -e та !-e використовуються для визначення, чи існує файл або каталог * -x та !-x використовуються для визначення, чи є файл виконуваним, чи ні 3. Останнім параметром інструкції перепису є позначка прапора, яка позначається так: 1.last еквівалентна позначці [L] в apache, що означає переписування. 2. Розрив Після завершення відповідності цього правила парування буде припинено, і наступні правила більше не будуть збігатися. 3.redirect повертає тимчасове перенаправлення 302, і адреса браузера відображає URL-адресу після переходу. 4. Постійне повернення 301 Постійне перенаправлення, адреса браузера покаже URL-адресу після переходу.
Використовуйте last і break для реалізації переписування URI, і адресна лінія браузера залишається незмінною. І між ними є невелика різниця: використання команди псевдоніму має бути позначено останнім; При використанні proxy_pass директив потрібно використовувати тег break. Після того, як останній тег буде виконано в цьому правилі переписування, він буде на сервері{......} Тег повторно ініціює запит, а тег break завершує матч після завершення відповідності правил. Наприклад: якщо ми перенаправимо URL на кшталт /photo/123456 на /path/to/photo/12/1234/123456.png переписати "/photo/([0-9]{2})([0-9]{2})([0-9]{2})"/path/to/photo/$1/$1$2/$1$2$3.png ;
Чотири. Правило NginxRewrite
1. Розірвати команду Середовище використання: сервер, місцезнаходження, якщо; Директива завершує поточний набір правил і більше не обробляє директиву переписування.
2. Якщо це вказівка Середовище використання: сервер, розташування Ця інструкція використовується для перевірки виконання умови, і якщо так, виконання оператора всередині завитих скоб. Команда If не підтримує вкладення і не підтримує кілька умов && та || Лікування.
3. Команда повернення Синтаксис: код повернення; Середовище використання: сервер, місцезнаходження, якщо; Ця інструкція використовується для завершення виконання правила та повернення статусного коду клієнту. Приклад: якщо відвідана URL закінчується на ".sh" або ".bash", повертається статус коду 403 Розташування ~ .*\. (sh|bash)?$
{ повернення 403;
}
4. Команда переписати Синтаксис: прапорець заміни rewriteregex Середовище використання: сервер, місцезнаходження, якщо Ця директива перенаправляє URI на основі виразу або змінює рядок. Інструкції виконуються у порядку у конфігураційному файлі. Зверніть увагу, що переписування виразів дійсне лише для відносних шляхів. Якщо ви хочете поєднати імена хостів, слід використовувати if оператори, наприклад нижче: якщо( $host ~* www\.(. *) )
{ сет $host_without_www $1; переписати ^(.*)$ http://$host_without_www$1permanent;
}
5. Встановити команду Синтаксис: значення setvariable; За замовчуванням: немає; Середовище використання: сервер, місцезнаходження, якщо; Ця директива використовується для визначення змінної та присвоєння їй значення. Значення змінної може бути текстовим, змінним або об'єднанням текстових змінних. Приклад: set$varname «hello world»;
6.Uninitialized_variable_warn інструкції Синтаксис: uninitialized_variable_warnon|off Середовище використання: http, сервер, місцезнаходження, якщо Ця команда використовується для вмикання та вимикання попереджувального повідомлення для неініціалізованих змінних, а значення за замовчуванням — Увімкнено.
П’ять. Приклад написання правил Nginx Rewrite 1. Якщо доступний файл і каталог відсутні, перенаправити їх на певний php-файл if( !-e $request_filename )
{ переписати ^/(.*)$ index.php останнім;
}
2. Обмін каталогами /123456/xxxx ====> /xxxx?id=123456 переписати ^/(\d+)/(.+)/ /$2?id=$1 останнє;
3. Якщо клієнт використовує браузер IE, він перенаправляє на каталог /ie if( $http_user_agent ~ MSIE)
{ переписати ^(.*)$ /ie/$1 break;
}
4. Вимкніть доступ до кількох каталогів Розташування ~ ^/(cron|шаблони)/
{ заперечувати все; перерва;
}
5. Вимкніть доступ до файлів, що починаються на /data Розташування ~ ^/data
{ заперечувати все;
}
6. Заборонити доступ до файлів із назвами суфіксів .sh, .flv, .mp3 Розташування ~ .*\. (sh|flv|mp3)$
{ повернення 403;
}
7. Встановіть час кешу браузера для певних типів файлів Розташування ~ .*\. (gif|jpg|jpeg|png|bmp|swf)$
{ термін дії закінчується 30 пенсів;
} Розташування ~ .*\. (js|css)$
{ закінчується 1 год;
}
8. Встановити терміни придатності для favicon.ico та robots.txt; Тут favicon.ico становить 99 днів, а robots.txt — 7 днів, і журнал помилок 404 не зареєстрований Розташування ~(favicon.ico) { log_not_found геть; термін дії закінчується 99 пенсів; перерва;
} Розташування ~(robots.txt) { log_not_found геть; термін дії закінчується 7 пенсів; перерва;
}
9. Встановити термін дії певного документа; Це 600 секунд, і журнали доступу не записуються location ^~ /html/scripts/loadhead_1.js { access_log пішов; root /opt/lampp/htdocs/web; термін закінчення 600 років; перерва;
}
10. Анти-гарячі лінки та встановлені терміни придатності Return412 — це власний HTTP-код, який за замовчуванням встановлюється на 403, що зручно для пошуку правильного запиту на гаряче посилання "переписати ^/ ; "Показує зображення анти-гарячого посилання "access_log геть;" Журнали доступу не фіксуються, що знижує стрес "Expires 3D" — 3 дні кешу браузера для всіх файлів
розташування ~*^.+\. (jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { valid_referers не заблоковано *.xx.com*.xx.net localhost 208.97.167.194; якщо ($invalid_referer) { переписати ^/ ; Повернення 412; перерва;
} access_log пішов; root /opt/lampp/htdocs/web; термін дії закінчується 3 пенси; перерва;
}
11. Дозволяйте фіксований IP-доступ до сайту лише з паролем
root /opt/htdocs/www; дозволити 208.97.167.194; дозволити 222.33.1.2; дозволити 231.152.49.4; заперечувати все; auth_basic «C1G_ADMIN»; auth_basic_user_file htpasswd;
12Конвертуйте файли в багаторівневих каталогах в один файл для покращення SEO-ефектів
/job-123-456-789.html 指向/job/123/456/789.html
rewrite^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;
13. Перенаправляйте, коли файли та каталоги відсутні:
if (!-e $request_filename) { proxy_pass http://127.0.0.1;
}
14. Вкажіть папку з кореневого каталогу до каталогу рівня 2 Наприклад, /shanghaijob/ вказує на /район/шанхай/ Якщо змінити останню на постійну, то адресний рядок браузера буде /location/shanghai/ переписати ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last; Проблема з наведеним вище прикладом у тому, що він не збігається при доступі до /shanghai переписати ^/([0-9a-z]+)job$ /area/$1/ last; переписати ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last; Цей шлях/шанхай також доступний, але відповідні посилання на сторінці недоступні, Якщо ./list_1.html справжня адреса /area/shanghia/list_1.html стане /list_1.html, що робить її недоступною. Тоді я не можу додати автоматичний стрибок (-d $request_filename) має умову, що це має бути справжня директорія, а моє переписування — ні, тому це не має значення якщо (-d $request_filename){ переписати ^/(.*)([^/])$ http://$host/$1$2/постійно;
} Це легко зробити, знаючи причину, дозвольте мені стрибати вручну переписати ^/([0-9a-z]+)job$ /$1job/постійний; переписати ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
15. Стрибок між доменними іменами Сервер
{ слухати 80; server_name jump.linuxidc.com; індекс index.html index.htm index.php; root /opt/lampp/htdocs/www; переписати ^/ http://www.xx.com/; access_log пішов;
}
16. Багатодоменне обертання server_name www.xx.comwww.xx.com; індекс index.html index.htm index.php; root /opt/lampp/htdocs; if ($host ~ "linuxidc\.net") { переписати ^(.*) http://www.xx.com$1permanent;
}
6. Глобальні змінні nginx arg_PARAMETER #这个变量包含GET请求中, якщо існує змінний ПАРАМЕТР. args #这个变量等于请求行中 (GET request) параметри, наприклад, foo=123&bar=blahblah; binary_remote_addr #二进制的客户地址. body_bytes_sent #响应时送出的body字节数数量. Ці дані є точними навіть при перериванні з'єднання. Поле content_length #请求头中的Content довжини. Поле типу content_type #请求头中的Content. cookie_COOKIE #cookie значення змінної COOKIE document_root #当前请求在root指令中指定的值. document_uri #与uri相同. #请求主机头字段 хост, інакше — ім'я сервера. Hostname #Set на ім'я хоста themachine, яке повертається GetHostname http_HEADER is_args #如果有args参数 ця змінна дорівнює "?", інакше дорівнює "", нульовому значенню. http_user_agent #客户端agent信息 http_cookie #客户端cookie信息 limit_rate #这个变量可以限制连接速率. query_string #与args相同. request_body_file #客户端请求主体信息的临时文件名. request_method #客户端请求的动作, зазвичай GET або POST. remote_addr #客户端的IP地址. remote_port #客户端的端口. remote_user #已经经过Auth Ім'я користувача підтверджено Базовим модулем. request_completion #如果请求结束, встанови на ОК. Спорожнення, коли запит не завершений або якщо запит не є останнім у ланцюжку запитів. request_method #GET或POST request_filename #当前请求的文件路径 генерується кореневими або псевдонімними директивами та URI-запитами. request_uri #包含请求参数的原始URI, вона не містить ім'я хоста, наприклад, "/foo/bar.php?arg=baz". не можна змінювати. Scheme #HTTP方法 (наприклад, HTTP, HTTPS). server_protocol #请求使用的协议, зазвичай HTTP/1.0 або HTTP/1.1. server_addr #服务器地址, це значення можна визначити після завершення системного виклику. server_name #服务器名称. server_port #请求到达服务器的端口号.
Сім. Відповідність між правилами апачів і нгінкс RewriteCond Apache відповідає Nginx, якщо RewriteRule Apache відповідає перепису Nginx [R] Apache відповідає перенаправленню Nginx [P] в апачській відповідає останньому в Нгінкс Apache [R,L] відповідає перенаправленню Nginx [P,L] Apache відповідає останньому у Nginx Apache [PT,L] відповідає останній у Nginx
Наприклад, дозвольте визначеному доменному імені доступ до цього сайту і завжди звертайтеся до www.xx.com інших доменних імен Апачі: RewriteCond %{HTTP_HOST} !^(.*?) \.aaa\.com$[NC] RewriteCond %{HTTP_HOST} !^localhost$ RewriteCond %{HTTP_HOST}!^192\.168\.0\. (.*?) $ RewriteRule ^/(.*)$ http://www.xx.com[R,L]
Nginx: якщо( $host ~* ^(.*)\.aaa\.com$ )
{ встановлено $allowHost '1';
} if( $host ~* ^localhost )
{ встановлено $allowHost '1';
} якщо( $host ~* ^192\.168\.1\.(. *?) $ )
{ встановлено $allowHost '1';
} якщо( $allowHost !~ '1' )
{ переписати ^/(.*)$ http://www.xx.comredirect ;
}
|