在通过重写地图

时间:2016-12-09 14:17:32

标签: apache mod-rewrite url-rewriting httpd.conf rewritemap

我在重写映射中有几百个URL重定向/重写的列表。大多数URL包含与重写映射中的特定条目匹配的查询字符串。我找到this question关于如何将查询字符串传递到重写映射。我得到了这个工作正常但现在的问题是现有的查询字符串被附加到重写的URL的末尾。例如:

Expected Rewrite:
/subdir/dir.cfm?categoryID=123 -> https://example.com/subdir/endurl   

Actual Rewrite:
https://example.com/subdir/endurl?categoryID=123

Expected Rewrite
/subdir/dir.cfm?videoID=3422424-131FDDFD-234 -> https://example.com/subdir/awesome/stuff

Actual Rewrite:
https://example.com/subdir/awesome/stuff?videoID=3422424-131FDDFD-234

这是我的重写规则:

RewriteEngine on

RewriteMap redirects dbm=sdbm:C:\Apache24\conf\redirects.sdbm
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*\.(cfm|cfml)) ${redirects:$1?%{QUERY_STRING}} [NC,R=301,L]

如何在重写后删除附加到URL的查询字符串?

修改

我实际上能够使用它来实现这个目的:

RewriteMap redirects dbm=sdbm:C:\Apache24\conf\redirects.sdbm
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*\.(cfm|cfml)) ${redirects:$1?%{QUERY_STRING}} [NC,C]
RewriteRule (.*) $1? [L,R=301]

但是我不确定是否有人知道更好的方法来完成我正在做的事情?我想如果我必须重定向到包含查询字符串的URL到另一个包含查询字符串的URL,这可能会中断。

1 个答案:

答案 0 :(得分:0)

在Apache 2.4.0及更高版本中,您可以使用[QSD]标志(查询字符串丢弃):

include("connection.php");
$dataget = $_POST["name"];
$datawaar = $_POST["zoekt"];
$stmt = $conn->prepare("SELECT * FROM student WHERE :waar=:postname");
$stmt->bindParam(':waar', $datawaar, PDO::PARAM_STR);
$stmt->bindParam(':postname', $dataget, PDO::PARAM_STR);
$stmt->execute();
echo "<table>";
while($data = $stmt->fetch(PDO::FETCH_ASSOC))
{   
    echo "<tr>";
    echo "<td align=center>$data[name]</td>";
    echo "<td align=center>$data[address]</td>";
    echo "<td align=center>$data[age]</td>";
    echo "</tr>";
}
echo "</table>";

在Apache 2.2版中,没有[QSD]标志,但如果替换URI包含查询字符串,RewriteRule的默认行为是丢弃现有的查询字符串,因此只需添加{{ 1}}到你的重写URI,你会得到同样的效果:

@android:color/transparent

(您新添加的重写规则实际上使用此功能)