我尝试将所有 url 重写为单个 php 文件,除非 url 指向现有文件,因为现有文件(如图像)应由服务器直接处理。但是如果有人使用一个看起来像文件的 url,而这个文件不存在,它应该得到一个 404。
我想出了以下 .htaccess 文件。这是一种有效的方法吗?本周五它将在生产服务器上,所以我想确定没有安全风险或者是某种不好的做法。
第一条规则应该确保任何看起来像正在请求文件的 url 都会得到 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
似乎工作。