1

我想将 htaccess 用于两个操作。有代码

RewriteRule ^File-(.+).php$ FileviewerID.php?x=$1
RewriteRule ^File-(.+).php$ File.php

但是这些代码不能一起运行

我想将文件 ID 发送到查看器并将其保存在 db 中,然后我只想为考试用户显示 File.php 发送此文件名 > www.sitename.com/File-256.php 现在将 256 保存在 DB 中并显示 File.php,我只想用 htaccess 做到这一点。

4

2 回答 2

1

Mod-rewrite 无法以这种方式按顺序提供文件。相反,它将通过规则列表进行,如果第一个规则之后的另一个规则匹配FileviewerID.php,它将随后被重写。因此,虽然可以使用 mod_rewrite 来匹配请求中的多个规则,但它不会执行分支到多个请求。

确实,处理这个问题的正确方法是在你的 PHP 代码中,而不是试图让 Web 服务器为你做这件事。

在成功写入数据库后FileviewerID.php,调用header()PHP 重定向到File.php.

// Fileviewer.php
// Write to database was successful, redirect to File.php...
header("Location: http://example.com/File.php");
exit();

评论后更新:

要使这适用于 以外的文件.php,您仍然可以使用 PHP 在数据库中存储并处理正确的重定向,但您需要从 Apache 中的重定向中检索更多信息。您应该捕获文件扩展名以及编号。

# Capture both the number and the extension
RewriteRule ^File-(\d+)\.([A-Za-z]+)$ FileviewerID.php?x=$1&ext=$2

在您的 PHPFielviewerID.php中,处理您的数据库操作并使用从$_GET['ext'].

// FileviewerID.php:
// Store file id in database from $_GET['x'] (hopefully using prepared statements)
// Then redirect using the file extension from $_GET['ext'], which holds an alphabetic string like "php" or "js"

// Verify that the extension is alphabetic
// Consider also checking it against an array of acceptable file extensions for 
// more reliable redirects.
if (preg_match('/^[a-z]+$/i', $_GET['ext'])) {
  header("Location: http://example.com/File.{$_GET['ext']}");
  exit();
}
else {
  // Redirect to some default location for an invalid extension
}
于 2012-12-22T14:38:48.477 回答
1

FileviewerID.php 页面必须先加载才能将 id 保存在数据库中

您应该将 FileviewerID.php 文件中的重定向重定向到 file.php

header("Location: File.php");
exit();
于 2012-12-22T14:40:08.270 回答