【问题标题】:.htaccess how to force/automatic clean URL.htaccess 如何强制/自动清除 URL
【发布时间】: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

http://site.com/index.php?cmd=shop

http://site.com/index.php?cmd=shop&cat=78&product=68

但是结果输出取决于它是什么。这些是我的结果:

http://site.com/cmd=shop&cat/78///

http://site.com/cmd/shop///

http://site.com/cmd=shop&cat=78&product/68///

我不知道如何让它将某些部分视为可选,以便正确分组。

【问题讨论】:

  • 您希望将更复杂的示例重定向到哪里? /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


【解决方案1】:

您需要分别处理每对参数的数量。您拥有的可用于处理一个名称/值对,然后类似地处理 2 和 3(如果需要,还可以使用 4):

# To handle a single name/value pair in the query string:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?([^&=]+)=([^&\ ]+)(\ |$) [NC]
RewriteRule ^ /%1\/%2? [R=301,L]

# To handle 2:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?([^&=]+)=([^&\ ]+)&([^&=]+)=([^&\ ]+)(\ |$) [NC]
RewriteRule ^ /%1\/%2/%3/%4? [R=301,L]

# To handle 3:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?([^&=]+)=([^&\ ]+)&([^&=]+)=([^&\ ]+)&([^&=]+)=([^&\ ]+)(\ |$) [NC]
RewriteRule ^ /%1\/%2/%3/%4/%5/%6? [R=301,L]

基本上,您要添加另一个&([^&=]+)=([^&\ ]+)检查请求结束时,(\ |$),然后在目标 URI 的末尾添加另一个/%#/%#,其中# 是适当的递增反向引用。

【讨论】:

  • 谢谢,这可以满足我的要求。 URL 是“干净的”,只是不是所有的 URL 都可以显示页面。 index.php?cmd=shop 变成 /cmd/shop 并显示正确的页面,但是 index.php?cmd=shop&cat=78 确实 变成 cmd/shop/cat/78 但是 不显示正确的页面,只是回到主页
  • @MrLewk 你有内部重写来获取像/A/B/C/D 这样的URI 并将其重写回/index.php?A=B&C=D
  • 是的,我这样做了,但由于某种原因他们没有让它工作,所以我要把它拆下来,逐行做,看看哪里出了问题。不过感谢您的回答,这让我比我自己更进一步!
猜你喜欢
  • 1970-01-01
  • 2013-05-12
  • 2012-01-10
  • 1970-01-01
  • 2016-05-27
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多