我重写了像site.com/product/p1
这样的规则,以成功site.com/product.php?p=p1
。
现在,我想相反,将从表单提交site.com/product.php?id=1234&name=test
收到的查询转换为site.com/product/test/1234
即我不希望网站访问者看到查询参数。
更清楚的是:在我的网站上,我有一个包含两个文本输入字段(以及一些隐藏字段(的表单;访问者可以输入产品ID和产品名称并提交表单。我希望生成的网址(在表单提交后(是平面的(site.com/product/test/1234
(,并且不包含任何参数。
当然,我希望我的脚本(product.php
(从表单中检索所有参数。我想我可以像把site.com/product/p1
变成site.com/product.php?p=p1
一样做到这一点。
谁能帮我?
mod_rewrite
通常不够灵活,无法做到这一点。当您有一个(并且只有一个(查询参数要处理时,这很好。添加更多参数时,需要处理查询参数的每个可能组合,并为每个参数设置新规则。 仅当您无法再以旧样式提供 URL 时,mod_rewrite
才适用,例如,如果您要升级无法修改的第三方服务器,并且希望httpd
处理将旧书签链接重定向到新位置的情况。
最好在 PHP 脚本本身中处理这个问题。"旧"product.php?id=1234&name=test
URL 处的脚本应读取GET
参数,并向新的product/test/1234
URL 返回HTTP 301
响应("永久移动"(。如果请求转到product.php
、product.php?name=test
、product.php?id=1234
或product.php?name=test&id=1234
,这将起作用。该脚本确定如何处理缺失值,以及如何生成替换 URL。
要仅使用单个查询参数进行重写,它看起来像是成功重写规则的反面,例如
RewriteCond %{QUERY_STRING} ^p=(.*)$
RewriteRule /product.php /product/%1 [R]