Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 11719|Отговор: 1

[Уеб] Пример илюстрира правилото за пренаписване в Nginx

[Копирай линк]
Публикувано в 5.12.2014 г. 22:45:25 ч. | | |
Едно. Съвпадение на регулярни изрази, където:
* ~ е съвпадение, чувствително към регистра
* ~* е съвпадение, което не е чувствителен към регистри
* !~ и !~* са съответно чувствителни към регистри и не-регистрови несъответствия
Две. Съвпадение на файл и директория, където:
* -f и !-f се използват за определяне дали съществува файл
* -d и !-d се използват за определяне дали съществува директория
* -e и !-e се използват, за да се определи дали съществува файл или директория
* -x и !-x се използват за определяне дали даден файл е изпълним или не
3. Последният параметър на инструкцията за пренаписване е знакът на флага, който се маркира с:
1.last е еквивалентно на марката [L] в apache, което означава пренаписване.
2. Пробив След като съвпадението на това правило бъде завършено, съвпадението ще бъде прекратено и следващите правила вече няма да се съвпадат.
3.redirect връща 302 временно пренасочване, а адресът на браузъра ще покаже URL адреса след скока.
4. Permanent return 301 Permanent redirect, адресът на браузъра ще покаже 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. Команда за връщане
Синтаксис: returncode ;
Среда за използване: сървър, местоположение, ако;
Тази инструкция се използва за прекратяване на изпълнението на правилото и връщане на статус код на клиента.
Пример: Ако посетеният URL приключи на ".sh" или ".bash", се връща статус код 403
Местоположение ~ .*\. (sh|bash)?$
{
връщане 403;
}


4. Команда за пренаписване
Синтаксис: rewriteregex флаг за замяна
Среда на използване: сървър, местоположение, ако
Тази директива пренасочва URI въз основа на израза или модифицира низа. Инструкциите се изпълняват в реда в конфигурационния файл. Обърнете внимание, че пренаписването на изрази е валидно само за относителни пътища. Ако искате да сдвоите имена на хостове, трябва да използвате if оператори, например по-долу:
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
1. Когато достъпеният файл и директория не съществуват, пренасочете към определен php файл
if( !-e $request_filename )
{
пренапишете ^/(.*)$ index.php последен;
}


2. Смяна на директории /123456/xxxx ====> /xxxx?id=123456
препишете ^/(\d+)/(.+)/ /$2?id=$1 last;


3. Ако клиентът използва браузър IE, той пренасочва към директорията /ie
if( $http_user_agent ~ MSIE)
{
препишете ^(.*)$ /ie/$1 break;
}


4. Деактивирайте достъпа до множество директории
Местоположение ~ ^/(CRON|шаблони)/
{
да отрече всичко;
прекъсване;
}


5. Деактивирайте достъпа до файлове, започващи с /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, което е удобно за намиране на правилната заявка за hotlink
"препишете ^/; "Показва изображение на анти-хотлинк
"access_log махни;" Не се записват логове за достъп, което намалява стреса
"Изтича 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


преписване^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;


13. Пренасочвай, когато файлове и директории не съществуват:


ако (!-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相同.
Хост #请求主机头字段, иначе името на сървъра.
Името на хоста #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 Потребителското име е валидирано от Basic Module.
request_completion #如果请求结束, настрой го на ОК. Празно, когато заявката не е завършена или ако заявката не е последната във веригата на заявките.
request_method #GET或POST
request_filename #当前请求的文件路径, генерирани от root или alias директиви и 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] на апачки съответства на последен в Нгинкс
[R,L] на Apache съответства на пренасочването на Nginx
Apache's [P,L] съответства на последния на Nginx
Apache's [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:
if( $host ~* ^(.*)\.aaa\.com$ )
{
зададена $allowHost '1';
}
if( $host ~* ^localhost )
{
зададена $allowHost '1';
}
ако( $host ~* ^192\.168\.1\.(. *?) $ )
{
зададена $allowHost '1';
}
ако( $allowHost !~ '1' )
{
пренапишете ^/(.*)$ http://www.xx.comredirect ;
}





Предишен:Sina Weibo сканира кода, за да плати 1 цент, за да получи годишния бонус до юан за 2015
Следващ:CMD5 разбива паролата на системния администратор на Windows
Публикувано в 7.12.2014 г. 17:25:05 ч. |
Четенето и публикуването обратно е добродетел
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com