1

我尝试将所有 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

似乎工作。

4

2 回答 2

1

我只会做你的第二次检查(如果文件存在),如果不存在,总是重定向到你的 index.php。

在那里您可以检查产品等并使用

header('HTTP/1.0 404 Not Found');
include('404.html');                  // <----- this is your 404 file
exit();

如果要生成 404 错误。

于 2013-09-10T19:40:43.430 回答
0

这是我在 .htaccess 文件中的操作方式

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1
于 2013-09-10T19:27:08.797 回答