可接受的mod_rewrite友好的 URL 方法


acceptable mod_rewrite friendly-url approach?

我尝试将所有网址重写为单个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