@hibinyru

Не корректно работает rewriteRule в htaccess?

Столкнулся с такой бедой - не корректно обрабатывается rewriterule в htaccess при кажущейся простате в обработке. не понимаю в какую сторону рыть, настройки сервера?

имею htaccess

RewriteEngine on
RewriteBase /
Options +FollowSymlinks

RewriteCond %{HTTP_HOST} ^domain\.net$ [NC]
RewriteCond %{REQUEST_URI} !^/robots.*
RewriteRule ^(.*)$ http://www.domain.net/$1 [R=301,L]

#RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
#RewriteRule ^index\.php$ / [R=301,L]

#RewriteCond %{REQUEST_METHOD} =GET
#RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
#RewriteRule ^(.*)$ %1/ [R=301,L]

RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..+$
RewriteRule ^(.*)$ $1/ [L,R=301]

RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/?$ index.php\?la\=$1&url\=$2&country\=$3&region\=$4&city\=$5&dop\=$6 [QSA,L] #/ru/forecast/Russia/Murmansk/Apatity/10days - <b>ЗДЕСЬ ПРОБЛЕМА!!!</b>
RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/?$      index.php\?la\=$1&url\=$2&country\=$3&region\=$4&city\=$5 [QSA,L] #/ru/forecast/Russia/Murmansk/Apatity
RewriteRule ^(.*)/(.*)/(.*)/(.*)/?$           index.php\?la\=$1&url\=$2&country\=$3&region\=$4 [QSA,L] #/ru/forecast/Russia/Murmansk
RewriteRule ^(.*)/(.*)/(.*)/?$                index.php\?la\=$1&url\=$2&country\=$3 [QSA,L] #/ru/forecast/Russia/
RewriteRule ^(.*)/(.*)/?$                     index.php\?la\=$1&url\=$2 [QSA,L] #/ru/forecast/
RewriteRule ^([^/.]*)/?$             	      index.php\?la\=$1 [QSA,L]
RewriteCond %{THE_REQUEST}  !images
RewriteCond %{THE_REQUEST}  !tr

AddDefaultCharset UTF-8

ErrorDocument 404 /404.php


при запросе
domain.net/ru/forecast/Russia/Moscow_oblast/Trostniki/ - выдает все как надо
т.е. la="ru", url="forecast", country="Russia" и т.д.
и при других запросах с меньшим кол-вом параметров тоже работает корректно.

а при запросе
domain.net/ru/forecast/Russia/Moscow_oblast/Trostniki/10days/ - параметр la (первый в обработке в htaccess) принимает значение la="ru/forecast" - соответственно, все остальные параметры получаются не корректные

разные вариации перепробовал, но так и не понял, в чем беда?!
  • Вопрос задан
  • 1746 просмотров
Решения вопроса 1
shambler81
@shambler81 Куратор тега htaccess
RewriteEngine on
RewriteBase /
Options +FollowSymlinks
AddDefaultCharset UTF-8
ErrorDocument 404 /404.php


############################################################################
#### Выбор основного зеркала (с www или без www)                        ####
############################################################################
   # 2. Добавить www
RewriteCond %{ENV:HTTPS} on
    #Если включен https
RewriteRule .* - [E=SSL:s]
    #То создаем переменную  ssl с текстом s
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
    # Если нет www в начале домена
RewriteCond %{REQUEST_URI} !^/robots.*
	# ваш robots.txt
RewriteRule ^(.*)$ http%{ENV:SSL}://www.%{HTTP_HOST}/$1 [R=301,L]
    #Подставляем www и https если он включен.
############################################################################
#### Перенаправляем протокол http на https                              ####
############################################################################
RewriteCond %{HTTPS} off
   # Проверяем наличие https в URL.
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
   # Перенаправляем протокол на http.

############################################################################
#### Убираем index.php, если он есть в конце URL                        ####
############################################################################
RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
   # URL cодержит index.php в конце.
RewriteCond %{REQUEST_METHOD} =GET
   # Выявляем GET запрос в URL (не POST).
RewriteRule ^(.*)$ %1/ [R=301,L]
   # Удалить index.php из URL.

############################################################################
#### Убираем повторяющиеся слеши (/) в URL                              ####
############################################################################
RewriteCond %{THE_REQUEST} //
   # Проверяем, повторяется ли слеш (//) более двух раз.
RewriteCond %{QUERY_STRING} !http(s|)://
  # Убедимся что это не урл в  GET
RewriteRule .* /$0 [R=301,L]
   # Исключаем все лишние слеши.

############################################################################
#### Убираем слеши в конце URL для статических файлов (содержит точку)  ####
############################################################################
RewriteCond %{REQUEST_URI} \..+$
   # Если файл содержит точку.
RewriteCond %{REQUEST_FILENAME} !-d
   # И это не директория.
RewriteCond %{REQUEST_FILENAME} -f
   # Является файлом.
RewriteCond %{REQUEST_URI} ^(.+)/$
   # И в конце URL есть слеш.
RewriteRule ^(.+)/$ /$1 [R=301,L]
   # Исключить слеш.

############################################################################
#### Добавляем слеш(/), если его нет, и это не файл.                    ####
############################################################################
RewriteCond %{REQUEST_URI} !(.*)/$
   # Если слеша в конце нет.
RewriteCond %{REQUEST_FILENAME} !-f
   # Не является файлом.
RewriteCond %{REQUEST_URI} !\..+$
   # В URL нет точки (файл).
RewriteCond %{REQUEST_URI} ^(.+)$
 # В URL есть хоть один символы
RewriteRule ^(.*)$ $1/ [L,R=301]
   # Добавляем слеш в конце.

############################################################################
#### Компрессия статического контента для гугл  спид тест               ####
############################################################################
<IfModule mod_deflate.c>
  AddType image/svg+xml .svg
  AddOutputFilterByType DEFLATE image/svg+xml  
  AddOutputFilterByType DEFLATE application/rss+xml
  AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
  AddOutputFilterByType DEFLATE application/x-font
  AddOutputFilterByType DEFLATE application/x-font-opentype
  AddOutputFilterByType DEFLATE application/x-font-otf
  AddOutputFilterByType DEFLATE application/x-font-truetype
  AddOutputFilterByType DEFLATE application/x-font-ttf
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE font/opentype
  AddOutputFilterByType DEFLATE font/otf
  AddOutputFilterByType DEFLATE font/ttf
  AddOutputFilterByType DEFLATE image/svg+xml
  AddOutputFilterByType DEFLATE image/x-icon
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/xml
  AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>
<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/svg "access plus 1 year"
  ExpiresByType image/gif "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType text/javascript "access plus 1 year"
  ExpiresByType text/css "access plus 1 year"
  ExpiresByType application/javascript "access plus 1 year"
  ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
  ExpiresByType application/x-font-ttf "access plus 1 year"
  ExpiresByType application/x-font-opentype "access plus 1 year"
  ExpiresByType application/x-font-woff "access plus 1 year"
  ExpiresByType image/svg+xml "access plus 1 year"
</IfModule>
  <IfModule mod_headers.c>
  <filesmatch "\.(ico|flv|jpg|jpeg|webp|png|gif|css|swf)$">
  	Header set Cache-Control "max-age=31536000, public"
  </filesmatch>
  <filesmatch "\.(html|htm)$">
  	Header set Cache-Control "max-age=7200, private, must-revalidate"
  </filesmatch>
  <filesmatch "\.(pdf)$">
  	Header set Cache-Control "max-age=86400, public"
  </filesmatch>
  <filesmatch "\.(js|otf|ttf|woff|woff2)$">
  	Header set Cache-Control "max-age=31536000, private"
  </filesmatch>
  </IfModule>
############################################################################
#### Конец общей части, далее следует собственные директивы .htaccess   ####
############################################################################

RewriteRule ^([^/.]*)/?$             	      index.php\?la\=$1 [QSA,L]
RewriteRule ^(.*)/(.*)/?$                     index.php\?la\=$1&url\=$2 [QSA,L] #/ru/forecast/
RewriteRule ^(.*)/(.*)/(.*)/?$                index.php\?la\=$1&url\=$2&country\=$3 [QSA,L] #/ru/forecast/Russia/
RewriteRule ^(.*)/(.*)/(.*)/(.*)/?$           index.php\?la\=$1&url\=$2&country\=$3&region\=$4 [QSA,L] #/ru/forecast/Russia/Murmansk
RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/?$      index.php\?la\=$1&url\=$2&country\=$3&region\=$4&city\=$5 [QSA,L] #/ru/forecast/Russia/Murmansk/Apatity
RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/?$ index.php\?la\=$1&url\=$2&country\=$3&region\=$4&city\=$5&dop\=$6 [QSA,L] #/ru/forecast/Russia/Murmansk/Apatity/10days - <b>ЗДЕСЬ ПРОБЛЕМА!!!</b>

#########RewriteCond %{THE_REQUEST}  !images
########RewriteCond %{THE_REQUEST}  !tr
######## А где рул !!!

Я тут подправил некоторые пункты, так что можешь посмотреть.
теперь что по поводу твоей пролемы, тут все просто, у тебя частные случаи срабатывают позней общих.
А в .* у тебя включиться может и / так что это удовлетворяет условию
если ты хочешь их исключить то пожалуйста вставь в каждую группу [^/] - исключить символ
ну или попробуй просто поменять местами. как я тебе показал, возможно этого вполне хватит поскольку .htaccess читается с верух в низ. и правила применяются вначале сверху потом снизу ( если до него дойдет)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы