Назад | Перейти на главную страницу

.htaccess изменяет правила и перенаправляет, если в URL-адресе есть .php

В моем .htaccess есть следующий код:

Options +FollowSymlinks
RewriteBase /temp/test/
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^about/(.*)/$ $1.php [L]
RewriteRule ^(.*)/download/(.*)/(.*)/(.*)/downloadfile/$ file-download.php?product=$1&version=$2&os=$3&method=$4 [L]
RewriteRule ^(.*)/download/(.*)/(.*)/(.*)/$ download-donate.php?product=$1&version=$2&os=$3&method=$4 [L]
RewriteRule ^(.*)/download/(.*)/$ download.php?product=$1&version=$2 [L]
RewriteRule ^subscribe/(.*)/$ subscribe-$1.php [L]
RewriteRule ^subscribe/(.*)/(.*)/$ subscribe-$1.php?email=$2 [L]
RewriteRule ^(.*)/screenshots/$ screenshots.php?product=$1 [L]
RewriteRule ^(.*)/(.*)/$ products.php?product=$1&page=$2 [L]
RewriteRule ^schedule-manager/$ products.php?product=schedule-manager&page=view [L]
RewriteRule ^visual-command-line/$ products.php?product=visual-command-line&page=view [L]
RewriteRule ^windows-hider/$ products.php?product=windows-hider&page=view [L]
RewriteRule ^(.*)/$ $1.php [L]

все работает идеально. Я хотел бы знать, как его изменить, чтобы в нем было меньше строк. Я почти уверен, что могу удалить по крайней мере 4-5 строк, но не знаю как. (объедините диспетчер расписания, визуальную-командную строку и окно-hider и многое другое).

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

Другое дело - я хотел бы перенаправить, например, www.myweb.com/products.php на www.myweb.com/products/ (я имею в виду, что URL в адресной строке изменится).

Я не знаю, может ли перенаправление соответствовать моим правилам перезаписи.

Спасибо.

РЕДАКТИРОВАТЬ: удалил RewriteRule продуктов (о чем упоминал Орблинг) и изменил 1 правило

Порядок важен, потому что вам нужно убедиться, что правила, соответствующие конкретным, предшествуют общим правилам, которые также улавливают особенности, но не должны.

Так, например, следующие строки с двумя параметрами:

RewriteRule ^newsletter-confirm/(.*)/$ newsletter-confirm.php?email=$1 [L]
RewriteRule ^newsletter-remove/(.*)/$ newsletter-remove.php?email=$1 [L]
RewriteRule ^(.*)/screenshots/$ screenshots.php?product=$1 [L]

Необходимо указать перед универсальным параметром double:

RewriteRule ^(.*)/(.*)/$ products.php?product=$1&page=$2 [L]

В противном случае они будут соответствовать запросу продукта (со страницей). Если вы заказываете с учетом этого приоритета, он должен работать приемлемо.

Вы можете реорганизовать правила, чтобы сделать их более лаконичными, но, вероятно, за счет удобочитаемости. Единственное избыточное правило - это последнее, так как предпоследняя строка его улавливает.

RewriteRule ^(.*)/$ $1.php [L]
RewriteRule ^products/$ products.php [L]

products/ является частным случаем общего (.*)/, так что будет совпадение универсальным перед обработкой, когда-либо прошедшей до этого последнего правила. К счастью, это все еще работает, так как ключевое слово, к счастью, совпадает с именем файла.