【问题标题】:acceptable mod_rewrite friendly-url approach?可接受的 mod_rewrite 友好 url 方法?
【发布时间】: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


【解决方案1】:

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

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

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

如果要生成 404 错误。

【讨论】:

  • 方法也不错!你能解释一下为什么你会选择你的解决方案吗?它更安全/更快吗?
  • 我发现它更容易。我不完全明白为什么您会在第一次检查时检查文件请求。使用^(.*)\.([-A-z0-9]+)$,您只能在子目录中检查,而不是在根目录中检查。所以 /myfile.html 没有得到 404。只有 /subdir/myfile.html 会得到 404。所以对于根目录中的所有这些请求,您仍然需要检查 index.php。那么为什么不简化它并在 index.php 中进行所有检查和 404 重定向,另外还有一个好处是为不存在的产品提供 404。
  • 谢谢!在我的系统中,root 也可以工作......我知道,我将永远需要两者。对于这种情况,我希望尽快处理文件处理,而 Apache 可以完成这项工作。从那里其他路由由 PHP 完成,非法路由也可能导致 404。
【解决方案2】:

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

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1

【讨论】:

  • 这也是我的第一个猜测。但是我有一个图像文件夹,如果有人请求像 /images/not-a-image.jpg 这样不存在的图像,我想得到一个 404。我的代码接缝处理。其余的工作类似,但我认为我不需要!-d。
猜你喜欢
  • 2011-01-04
  • 2012-02-25
  • 2012-12-29
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多