可接受的mod_rewrite friendly-url方法?

时间:2013-09-10 19:24:59

标签: php apache .htaccess mod-rewrite http-status-code-404

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

似乎工作。

2 个答案:

答案 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