我想用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来做。
答案 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();