В моем .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/
является частным случаем общего (.*)/
, так что будет совпадение универсальным перед обработкой, когда-либо прошедшей до этого последнего правила. К счастью, это все еще работает, так как ключевое слово, к счастью, совпадает с именем файла.