在.htaccess重写URL,虚拟路径不会导致404页,但暴露PHP警告(Rewrite url

2019-09-30 10:50发布

我有这些自定义的.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页),但没有运气:拜托,你能帮帮我吗? 提前致谢

Answer 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处理器。



Answer 2:

至少你的最后一条规则

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

将所有请求/home/index.php ,我想这个脚本是你所得到的警告源。

既然你这样的规则,想必你真的想不存在的,文件去这个脚本。 它不会帮助,然后以防止调用脚本因为Apache无法知道哪些网址工作,这不是。

所以,你需要检查缺少的参数或包含你的PHP脚本文件。 这是特别合理的,因为你永远不知道什么参数攻击者可能会打电话,因为你已经提到。 一般的经验法则是在使用前检查有效性的所有参数。

当你添加了所有这些检查,这是很好的做法,关闭错误显示(有对于一个php.ini条目display_errors ),但只有在一个文件中(其他条目,记录错误log_errors在生产系统中)。



文章来源: Rewrite url in .htaccess, dummy paths don't lead to 404 page but expose PHP warnings