在htaccess中使用相同的重写规则

时间:2012-12-22 14:31:45

标签: php .htaccess

我想用htaccess做两个动作。有代码

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

但此代码无法一起运行

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

2 个答案:

答案 0 :(得分:1)

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

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

FileviewerID.php成功写入数据库后,请在PHP中调用header()以重定向到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

在您的PHP FielviewerID.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
}

答案 1 :(得分:1)

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

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

header("Location: File.php");
exit();