我尝试将所有网址重写为单个php文件,除非网址指向现有文件,因为图像等现有文件应由服务器直接处理。但是,如果有人使用看起来像文件的 url,并且此文件不存在,则应获取 404。
我想出了以下.htaccess文件。这是一种有效的方法吗?它将在本周五在生产服务器上,因此我想确定没有安全风险或某种不良做法。
第一条规则应确保任何看起来像正在请求文件的 url 都将获得 404(当然,仅当文件不存在时)。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)'.([-A-z0-9]+)$ - [R=404,L]
如果上面不匹配,则还有第二条规则将所有其他不存在的文件重写为索引.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
似乎有效。
我只会进行第二次检查(如果文件存在),如果没有,请始终重定向到您的索引.php。
在那里,您可以检查产品等并使用
header('HTTP/1.0 404 Not Found');
include('404.html'); // <----- this is your 404 file
exit();
如果要生成 404 错误。
这是我
在我的.htaccess文件中的操作方法
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1