jkm

Рейтинг
120
Регистрация
20.02.2014

http://nginx.org/ru/docs/http/ngx_http_rewrite_module.html

Сначала последовательно выполняются rewrite, описанные на уровне server.

Только потом уже начинается поиск location по URI запроса и последовательно выполняются директивы описанные в найденном location.


server {
rewrite "^/([^.]+)(/?)+$" /index.php?do=cat&category=$1 last;

location /user/ {
rewrite ^/user/([^/]*)(/?)+$ /index.php?subaction=userinfo&user=$1 last;
}
}

В строке /user/johnylee/ нет точек, поэтому она совпадает с шаблоном "^/([^.]+)(/?)+$".

Т.е. этот шаблон перехватит любой запрос, где нет точек.

Самое простое решение это вынести все правила с rewrite на уровень server.


rewrite "^/([^.]+)/page/([0-9]+)(/?)+$" /index.php?do=cat&category=$1&cstart=$2 last;
rewrite "^/([^.]+)(/?)+$" /index.php?do=cat&category=$1 last;

Эти два правила перенести в самый конец.

Или rewrite c уровеня server перенести в location /


location / {
rewrite "^/xfsearch/([^.]*)(/?)+$" /index.php?do=xfsearch&xf=$1 last;
rewrite "^/xfsearch/([^.]*)/page/([0-9]+)(/?)+$" /index.php?do=xfsearch&xf=$1&cstart=$2 last;
rewrite "^/page/([0-9]+)(/?)$" /index.php?cstart=$1 last;
rewrite ^/page/(.*)$ /index.php?cstart=$1 last;

rewrite "^/([0-9]{4})/([0-9]{2})/([0-9]{2})(/?)+$" /index.php?year=$1&month=$2&day=$3 last;
rewrite "^/([0-9]{4})/([0-9]{2})/([0-9]{2})/page/([0-9]+)(/?)+$" /index.php?year=$1&month=$2&day=$3&cstart=$4 last;
rewrite "^/([0-9]{4})/([0-9]{2})(/?)+$" /index.php?year=$1&month=$2 last;
rewrite "^/([0-9]{4})/([0-9]{2})/page/([0-9]+)(/?)+$" /index.php?year=$1&month=$2&cstart=$3 last;
rewrite "^/([0-9]{4})(/?)+$" /index.php?year=$1 last;
rewrite "^/([0-9]{4})/page/([0-9]+)(/?)+$" /index.php?year=$1&cstart=$2 last;
rewrite "^/([^.]+)/page/([0-9]+)(/?)+$" /index.php?do=cat&category=$1&cstart=$2 last;
rewrite "^/([^.]+)(/?)+$" /index.php?do=cat&category=$1 last;

И несколько правил для .xml перенести в location ~ \.(html|xml)


rewrite ^/user/([^/]*)/rss.xml$ /engine/rss.php?subaction=allnews&user=$1 last;
rewrite ^/user/([^/]*)/news/rss.xml(/?)+$ /engine/rss.php?subaction=allnews&user=$1 last;

rewrite ^/catalog/([^/]*)/rss.xml$ /engine/rss.php?catalog=$1 last;
Headlesz:

RewriteCond %{REQUEST_URI} ^/cats(.*)$ [NC]
RewriteRule ^cats(.*)$ /catalog$1 [L,R=301]

RewriteRule ^cats(.*)$ https://site.ru/catalog$1 [L,R=301]

Headlesz, в правилах для замены CATS и удаления .html нужно указать полный адрес c https://domain и поставить их над правилом для редиректа на https.

dwell:
Подскажите, пожалуйста, как сделать редирект через htaccess всех адресов из определенной директории с пробелами на адреаса с дефисами?
Т.е. чтобы все адреса
http://site.com/search/primer stranici/ и, соответственно,
http://site.com/search/primer%20stranici/
Редиректились на
http://site.com/search/primer-stranici/

При этом чтобы в остальных директориях пробелы в адресах не редиректились!

RewriteRule "^(search/.*?) (.*)" /$1-$2 [R=301,L]
proweb.com.ua:
Всем привет!
Помогите сформировать правильно htaccess
Есть некий список айпи адресов доступ которым к сайту закрыт.
Мне нужно разрешить всем доступ к одной странице сайта.
Как это реализовать средствами .htaccess?
Сейчас вот:
Order Allow,Deny

Allow from all
#
Deny from x.x.x.0/x
Deny from x.x.x.0/x
--//--

Можно добавить SetEnvIf и поменять порядок в Order.

SetEnvIf Request_URI ^/page1$  allow_page=1


Order Deny,Allow

Allow from env=allow_page
Allow from env=redirect_status

Deny from x.x.x.0/x
Deny from x.x.x.0/x
baas:
Хмм.
Так пробовали?
Order deny,allow

deny from all
Allow from 227.123.80.0/24

Там же ещё код ответа нужно сменить с 403 на 404.

Файл /admin/.htaccess


ErrorDocument 403 /404.php

Order deny,allow
Deny from all
Allow from 227.123.80.0/24

Файл /404.php


<?php
http_response_code(404);

Вариант с mod_rewrite

/admin/.htaccess


ErrorDocument 403 /404.php

DirectorySlash off

RewriteEngine on

RewriteCond %{REMOTE_ADDR} <227.123.80.5 [OR]
RewriteCond %{REMOTE_ADDR} >227.123.80.227
RewriteRule ^ - [F]
Gagarin12:
Вроде работает, она корректная? Косяков нет?

Все нормально. Можно даже не R=permanent, а redirect=permanent - это всё синонимы R=301.

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^/?(.*) https://%1/$1 [L,redirect=permanent]

^/? обеспечивает одинаковую работу в контексте VirtualHost и .htaccess.

В контексте VirtualHost строка с которой работает RewriteRule всегда начинается с "/", а в .htaccess всё наоборот.

Dram:
var='/etc/init.d/nginx reload';

Там нужно не кавычки, а обратные апострофы

var=`/etc/init.d/nginx reload`; 

Просто удалить \r

tr -d '\r' < blockip.sh > blockip_fix.sh
Dram:
но мне выдает
blockip.sh: line 3: $'\r': command not found

В Window конец строки это последовательность из двух символов \r\n, а в Unix конец строки только один символ \n.

Всего: 750