重写.htaccess中的网址,虚拟路径不会导致404页面,但会显示PHP警告

时间:2016-10-08 09:35:27

标签: regex .htaccess url-rewriting

我有这些自定义.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=$1&iModule=3                [NC,L]
    RewriteRule         ^(.*)/3/(.*)/(.*)/(.*).htm$  /products/details.php?nLang=$1&iData=$3&iModule=3     [NC,L]
    RewriteRule         ^(.*)/4/(.*)/$               /foreground/index.php?nLang=$1&iModule=4              [NC,L]
    RewriteRule         ^(.*)/4/(.*)/(.*)/(.*).htm$  /foreground/details.php?nLang=$1&iData=$3&iModule=4   [NC,L]
    RewriteRule         ^(.*)/5/(.*)/$               /specials/index.php?nLang=$1&iModule=5                [NC,L]
    RewriteRule         ^(.*)/5/(.*)/(.*)/(.*).htm$  /specials/details.php?nLang=$1&iData=$3&iModule=5     [NC,L]
    RewriteRule         ^(.*)/6/(.*)/$               /gallery/index.php?nLang=$1&iModule=6               [NC,L]
    RewriteRule         ^(.*)/6/(.*)/(.*)/(.*).htm$  /gallery/details.php?nLang=$1&iData=$3&iModule=6     [NC,L]
    RewriteRule         ^(.*)/(.*)/(.*)/(.*).htm$    /home/page.php?nLang=$1&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警告和关于缺少变量和包含文件的通知,这可能导致安全问题和恶意攻击

我尝试了几个方法来获得一个可以使用这些路径的RegExp(所以我可以将用户重定向到404页面),但没有运气:拜托,拜托,你能帮助我吗?提前致谢

2 个答案:

答案 0 :(得分: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/,但会允许其他网址,例如/it/dummy/转到404处理程序。

答案 1 :(得分:0)

至少你的最后一条规则

RewriteRule         ^(.*)/$                      /home/index.php?nLang=$1  

将所有请求发送到/home/index.php,我想这个脚本是您收到警告的来源。

由于您拥有这样的规则,大概您可能希望不存在的文件转到此脚本。因为Apache无法知道哪些网址可以使用而哪些网址不起作用,因此无法阻止调用脚本。

因此,您需要检查缺少的参数或在PHP脚本中包含文件。这是特别合理的,因为您永远不知道攻击者可能会调用哪些参数,正如您已经提到的那样。一般的经验法则是在使用之前检查所有参数的有效性。

添加所有这些检查后,最好关闭错误显示(有一个php.ini条目,display_errors),但只记录文件中的错误(另一个条目,{{1在生产系统中。