Переписать URL в .htaccess, фиктивные пути не ведут на страницу 404, но выставляют предупреждения PHP

#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 ) в производственной системе.