【发布时间】:2013-09-10 19:24:58
【问题描述】:
我尝试将所有 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
似乎有效。
【问题讨论】:
-
+1 我认为这确实是一种有效的方法,但
RewriteRule ^(.*)\.([-A-z0-9]+)$ - [R=404,L]应该替换为:RewriteRule ^.+?\.[^./]+$ - [R=404,L] -
谢谢!我试着理解你的正则表达式。你能简单解释一下吗?
-
@anubhava
[^./]+也不意味着他不存在的文件 /product/23 也会得到 404(他希望由 /index.php 处理)? -
@Rik 否,因为
[^./]+在一个点之后。 -
@Sander Aaah。现在我想我看到了。我把斜杠和反斜杠弄混了(太晚了)。您正在检查带有扩展名的文件并给出 404。这工作正常。只有 /product/mybugus_product 可以在没有 404 的情况下访问 index.php,但也许这对您来说不是问题。
标签: php apache .htaccess mod-rewrite http-status-code-404