【发布时间】:2013-01-11 22:08:44
【问题描述】:
我是 mod_rewrite 的新手,但我正在尽力用干净的 URL 修复我的网站。
使用 RewriteRule 我可以得到它,这样你就可以输入一个干净的 URl 并进入正确的页面,但我遇到的问题是如果使用“混乱”的 URL(即由于用户提交的链接和内容等,很有可能)
现在,我在另一个 .htaccess 论坛上找到了这段代码,它适用于一种情况,但不适用于另一种情况。我来解释一下:
# FORCE CLEAN URLS
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?(.*)=([^\s]+) [NC]
RewriteRule ^ %1\/%2? [R=301,L]
这适用于这样的地址,例如:www.domain.com/index.php?cmd=login 它会自动重定向到 www.domain.com/cmd/登录
但是当有多个查询时问题就来了,例如:www.domain.com/index.php?cmd=view-profile&user=bob
当地址中可能有多达 3 个或更多的查询时,我不知道如何让它整理出那种 URL。 我不完全胜任正则表达式,所以我尝试修改代码 sn-p 到目前为止失败了。
任何帮助将不胜感激!我希望它们是 301 重定向,以便网站可以正确编入索引并符合 SEO,无论使用哪种类型的干净或凌乱的 URL,但我愿意接受建议!
编辑
在玩了几个小时的正则表达式后,我进步了,但又被难住了。
如果我这样表达:
index\.php\?(.*)=([^\s]+)(&(.*)=([^\s]+))?+
$1/$2/$3/$4/$5
它将匹配从 index.php 开始的这 3 个 URL:
http://site.com/index.php?cmd=shop&cat=78
但是结果输出取决于它是什么。这些是我的结果:
我不知道如何让它将某些部分视为可选,以便正确分组。
【问题讨论】:
-
您希望将更复杂的示例重定向到哪里? /view-profile/bob?
-
@DaveSteinberg - 是的,如果 URL 的其他部分存在,我希望像这样处理它们
-
¿此 URL
www.domain.com/index.php?cmd=view-profile&user=bob方案与应保留查询的方案有何不同? -
@faa 按照原样重写,它将把: ?cmd=login 变成 /cmd/login/ 但它 不会把 ?cmd=view-profile&user=bob 变成 /cmd/view-profile/user/bob
-
@MrLewk 我知道,无论参数数量如何,您都希望删除查询(
?之后的字符串)。但是您不需要保留其他 URL 与查询,或者想法是从所有 URL 中抑制它吗?如果是这样的话,这看起来不是一个好主意,这就是我问的原因。
标签: apache .htaccess mod-rewrite clean-urls