我尝试将所有url重写为单个php文件,除非url导致现有文件,因为像图像这样的现有文件应由服务器直接处理。但如果有人使用看起来像文件的网址,并且该文件不存在,则应该获得404。
我想出了以下.htaccess文件。这是一种有效的方法吗?它本周五将在生产服务器上,所以我想确定没有安全风险或某种不良做法。
第一条规则应该确保在请求文件时看起来像的任何网址都会得到404(仅当文件当然不存在时)。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.([-A-z0-9]+)$ - [R=404,L]
如果上面的内容不匹配,则会有第二条规则将所有其他非现有文件重写为index.php(例如/ products / 23)。在这种情况下,index.php将处理其余的路由。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php [L]
如果没有规则匹配,则表示找到了现有文件,并且将直接由apache提供服务,如现有图像和脚本。
这是一种有效的方法吗?感谢。
编辑:
稍微缩短的方法,结果相似:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.([-A-z0-9]+)$ - [R=404,L]
FallbackResource /index.php
似乎工作。
答案 0 :(得分:1)
我只会进行第二次检查(如果文件存在),如果没有,请始终重定向到index.php。
您可以对产品等进行检查并使用
header('HTTP/1.0 404 Not Found');
include('404.html'); // <----- this is your 404 file
exit();
如果您想生成404错误。
答案 1 :(得分:0)
以下是我在.htaccess文件中的操作方法
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1