#regex #.htaccess #url-rewriting
#регулярное выражение #.htaccess #url-перезапись
Вопрос:
У меня есть эти пользовательские перенаправления .htaccess
# Add a trailing slash to folders that don't have one
RewriteCond %{REQUEST_URI} !(/$|.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
# Exclude these folders from rewrite process
RewriteRule ^(admin|ajax|cache|classes|css|img|webassist|js)($|/) - [L]
# Redirect root requests to /home/ folder
RewriteRule ^(/home/)?$ /home/index.php?nLang=it [NC,L]
# Start rewriting rules
RewriteRule ^risultati.htm$ /home/results.php [NC,L,QSA]
RewriteRule ^sfogliabile/(.*).htm$ /flip/browser.php?iCat=$1 [NC,L]
RewriteRule ^depliant/(.*).htm$ /flip/flyer.php?iSpecial=$1 [NC,L]
RewriteRule ^(.*)/ricerca/$ /ricerca/index.php?nLang=$1 [NC,L,QSA]
RewriteRule ^(.*)/professional/$ /home/pro.php?nLang=$1 [NC,L]
RewriteRule ^(.*)/3/(.*)/$ /products/index.php?nLang=$1amp;iModule=3 [NC,L]
RewriteRule ^(.*)/3/(.*)/(.*)/(.*).htm$ /products/details.php?nLang=$1amp;iData=$3amp;iModule=3 [NC,L]
RewriteRule ^(.*)/4/(.*)/$ /foreground/index.php?nLang=$1amp;iModule=4 [NC,L]
RewriteRule ^(.*)/4/(.*)/(.*)/(.*).htm$ /foreground/details.php?nLang=$1amp;iData=$3amp;iModule=4 [NC,L]
RewriteRule ^(.*)/5/(.*)/$ /specials/index.php?nLang=$1amp;iModule=5 [NC,L]
RewriteRule ^(.*)/5/(.*)/(.*)/(.*).htm$ /specials/details.php?nLang=$1amp;iData=$3amp;iModule=5 [NC,L]
RewriteRule ^(.*)/6/(.*)/$ /gallery/index.php?nLang=$1amp;iModule=6 [NC,L]
RewriteRule ^(.*)/6/(.*)/(.*)/(.*).htm$ /gallery/details.php?nLang=$1amp;iData=$3amp;iModule=6 [NC,L]
RewriteRule ^(.*)/(.*)/(.*)/(.*).htm$ /home/page.php?nLang=$1amp;iData=$3 [NC,L,QSA]
RewriteRule ^(.*)/$ /home/index.php?nLang=$1 [NC,L]
Это работает довольно хорошо для всех страниц, за исключением случаев, когда я ввожу некоторые несуществующие пути, такие как:
/it/dummy/
/it/dummy/dummy/
/it/dummy/dummy/dummy/
etc...
Вместо страницы ошибки 404 я получаю страницу с предупреждением PHP и уведомлениями об отсутствующих переменных и файлах включения, что может привести к проблемам безопасности и вредоносным атакам
Я попробовал несколько способов получить регулярное выражение, которое работает с такими путями (чтобы я мог перенаправить пользователя на страницу 404), но безуспешно: пожалуйста, вы можете мне помочь? Заранее спасибо
Ответ №1:
Измените свое последнее правило на это,
# If the request is not for a valid directory
RewriteCond %{REQUEST_FILENAME} !-d
# If the request is not for a valid file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-z] )/$ home/index.php?nLang=$1 [L,QSA,NC]
Таким образом, он будет обрабатывать только языковой параметр, например /it/
, или /en/
, но позволит другим URL-адресам, например /it/dummy/
, перейти к обработчику 404.
Ответ №2:
По крайней мере, ваше последнее правило
RewriteRule ^(.*)/$ /home/index.php?nLang=$1
отправляет все запросы /home/index.php
, и я полагаю, что этот скрипт является источником предупреждений, которые вы получаете.
Поскольку у вас есть такое правило, предположительно, вы на самом деле хотите, чтобы несуществующие файлы отправлялись в этот скрипт. Тогда это не помогло бы предотвратить вызов скрипта, потому что Apache не мог знать, какие URL-адреса будут работать, а какие нет.
Поэтому вам нужно проверить наличие отсутствующих параметров или включить файлы в ваш php-скрипт. Это особенно разумно, потому что вы никогда не знаете, какие параметры могут вызвать злоумышленники, как вы уже упоминали. Общее эмпирическое правило — проверять все параметры на достоверность перед их использованием.
После того, как вы добавили все эти проверки, рекомендуется отключить отображение ошибок (для этого есть запись php.ini display_errors
), но регистрировать ошибки только в файле (другой записи log_errors
) в производственной системе.