求助:Url RewriteRule

  [复制链接]
查看: 702   回复: 12
发表于 2014-1-20 13:22:54 | 显示全部楼层 |阅读模式
本帖最后由 amnoob 于 2014-1-20 13:25 编辑

不懂程序就是麻烦啊,求助:Url RewriteRule求助:Url RewriteRule求助:Url RewriteRule

求一条RewriteRule的写法:

  1. Options +FollowSymLinks
  2. RewriteEngine On
  3. RewriteRule ^(.*).html$ $1.php [L]
  4. RewriteRule ^([0-9]+)/(.*)$ product-details.php?id=$1 [QSA]   
复制代码
输出Url:
  1. http://www.mydomain.com/1392/tao-of-badass.html
复制代码

  1. RewriteRule ^(.*)/(.*)$ product-details.php?id=$1 [QSA]
复制代码
输出Url:
  1. http://www.mydomain.com/1392/tao-of-badass.html
复制代码
求助:要怎么写才能让Url把”product id“也省了啊,让它直接输出
  1. http://www.mydomain.com/tao-of-badass.html
复制代码

发表于 2014-1-20 14:28:33 | 显示全部楼层
ID 貌似不能去啊 去了 apache或者NGINX就不知道具体是什么网址了
回复 支持 反对

使用道具 举报

发表于 2014-1-20 14:57:10 | 显示全部楼层
ID不能去掉,可以移动到文件名后面
回复 支持 反对

使用道具 举报

发表于 2014-1-20 15:01:36 | 显示全部楼层
看你的程序是否支持通过文件名获取文章


评分

参与人数 1T币 +1 收起 理由
amnoob + 1 送花花~~~

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-20 15:13:33 | 显示全部楼层
多谢各位!

回2#、3#,我觉得肯定是可以去掉id#的,像WP一样去掉page id(article id),直接输出如
http://mydomain.com/article-name.html
这样的url的啊

回4#,程序肯定是支持的,因为我看到别人的使用同一程序的网站就是把id#去掉的url,只是不知道人家的RewriteRule怎么写啊 求助:Url RewriteRule
回复 支持 反对

使用道具 举报

发表于 2014-1-20 15:22:15 | 显示全部楼层
应该不是apache rewrite单独完成的,还需要你用的程序的url route配合。仔细看看你的程序有没有friendly url设置

评分

参与人数 1T币 +1 收起 理由
amnoob + 1 送花花~~~

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-23 14:37:56 | 显示全部楼层
咚咚来了 发表于 2014-1-20 15:22 求助:Url RewriteRule
应该不是apache rewrite单独完成的,还需要你用的程序的url route配合。仔细看看你的程序有没有friendly ur ...


多谢!

程序后台没找到可以设置URL的地方。不过我买的程序是盗版的,难道是这个原因,功能有删减.  求助:Url RewriteRule

回复 支持 反对

使用道具 举报

发表于 2014-1-24 13:16:24 | 显示全部楼层
本帖最后由 咚咚来了 于 2014-1-24 13:18 编辑
amnoob 发表于 2014-1-23 14:37 求助:Url RewriteRule
多谢!

程序后台没找到可以设置URL的地方。不过我买的程序是盗版的,难道是这个原因,功能有删减.  :di ...

不清楚你用的什么程序。

不过web程序都一个道理。 apache rewrite只是简单地映射, 就比如你主楼帖子写的例子,把用户请求的url:
  1. http://www.mydomain.com/1392/tao-of-badass.html
复制代码
映射成:
  1. http://www.mydomain.com/product-details.php?id=1392
复制代码
注意后面的"?id=xxx",你要熟悉编程的话,就知道这是query string,就是请求参数,意思是:我要请求产品细节,哪个产品的?id为1392的。

但是apache只能做到这一步。剩下的就是你的程序根据请求的功能和附带参数去处理。例如这个例子就是调用product-details相关功能,去数据库取产品id为1392的数据,处理后返回给浏览器。

因此,你想省略id,必须需要你的程序支持。例如,wordpress就支持。wordpress就可以设置省略post id,但是需要提供slug,就是post name, 类似于你举例中的“tao-of-badass”







评分

参与人数 1T币 +1 收起 理由
amnoob + 1 非常感谢!

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-24 15:14:15 | 显示全部楼层
咚咚来了 发表于 2014-1-24 13:16 求助:Url RewriteRule
不清楚你用的什么程序。

不过web程序都一个道理。 apache rewrite只是简单地映射, 就比如你主楼帖子写的 ...

非常感谢!

我看了一下,我的product name不具有唯一性,只有product id才具有唯一性,再对比同程序的人家的站,同名的产品时它会自动在url中加上"-1"/"-2"/"-3"这样(比如我举的例子“tao-of-badass.html”, "tao-of-badass-2.html");这个肯定是通过php实现的吧?

看样子我只能放弃这个省略id的想法了。

再请教一下兄台哦:

我现在好多页面都被google重复收录了两次,因为我自己站内url是用

  1. RewriteRule ^([0-9]+)/(.*)$ product-details.php?id=$1 [QSA]
复制代码

  1. "http://www.mydomain.com/1392/任何url可识别的规范化字符"如我例子中的"http://www.mydomain.com/1392/tao-of-badass.html"
复制代码
这样的格式;

外链站因为是rss订阅的,用的是程序的原始url即

  1. http://www.mydomain.com/product-details.php?id=1392
复制代码
这样的格式.

现在想通过301告诉google,“product-details.php?id=1392”的实际url其实是“1392/xxxxxxxx.xxx(比如1392/tao-of-badass.html)”

这个RewrtieRule应该怎么写呢?

我想当然地以为是

  1. RewriteRule ^product-details.php?id=([0-9]+)$ ([0-9]+)/$1
复制代码
结果不行啊.


回复 支持 反对

使用道具 举报

发表于 2014-1-24 19:08:25 | 显示全部楼层
本帖最后由 咚咚来了 于 2014-1-24 19:13 编辑
amnoob 发表于 2014-1-24 15:14 求助:Url RewriteRule
非常感谢!

我看了一下,我的product name不具有唯一性,只有product id才具有唯一性,再对比同程序的人 ...

1. 第一个问题
你举例说的别人的网站,有可能后面那个就是id, 这也是很常见的一种做法,特别是中文cms,因为中文的cms多数都不支持slug。
yousite.com/tao-of-badass-1392.html rewrite到 product-details.php?id=1392 可以做到,也就是把
形如yousite.com/product_name-product_id.html rewrite到 product-details.php?id=product_id
只需一条:
  1. Options +FollowSymLinks
  2. RewriteEngine On
  3. RewriteRule ^(.*)-([0-9]+)\.html$ product-details.php?id=$2 [QSA]
复制代码
但是这有个前提,就是你能把你网站的URL格式设置成 yousite.com/XXXXX-xxx.html 的形式(大写XXXX代表类似的“tao-of-badass”的东西,小写xxx代表类似1392的id), 不然用户根本得不到这种形式的url,更不用说通过浏览器访问了。


2. 第二个问题
  1. URL形式 A:
  2. http://www.mydomain.com/product-details.php?id=1392
复制代码
  1. URL形式 B:
  2. http://www.mydomain.com/1392/tao-of-badass.html
复制代码
首先确定你的这个1392到底什么,以下假设是product id,否则如果是其他的,例如分类id,那就很不一样了。

如果想从B rewrite到A很容易,因为形式A就需要一个id,B的1392可以传过去。 但是要反过来,想把A rewrite到B,也就是你说的:
现在想通过301告诉google,“product-details.php?id=1392”的实际url其实是“1392/xxxxxxxx.xxx(比如1392/tao-of-badass.html)”

可能就不行了(我觉得不行,其他兄弟有没有会的?)。因为对于不同的id,B后面的xxxx.html中的xxxx从哪里来呢?得不到。而且“product-details.php?id=1392” 这种形式的URL是你最终程序route处理的url,你把它rewrite到某种形式,肯定还得rewrite回来,在兜圈子。

如果要处理你现在的重复收录,我能想到的两种方式,一种就是让收录的url都定向到原始url,也就是“product-details.php?id=1392” 这种形式。这种方案,只需要把已经收录的B 301定向到A。

另一种就是需要改一下你用的程序的前台模板(甚至可能需要改一下程序),就是使用canonical标签。以wordpress为例,wordpress原始url是这样的:
  1. http://www.yoursite.com/?p=postid

  2. http://www.yoursite.com/?p=1392
复制代码
wordpress设置“friendly URL”之后,可以变成这样:
  1. http://www.yoursite.com/post-name

  2. http://www.yoursite.com/tao-of-badass
复制代码
这样就有两个url,一个是原生url,另一个是“搜索引擎友好的”或者“用户友好的”url,但是都指向同一个页面。为了告诉搜索引擎只收录“友好的”url,可以修改模板,在单页模板的html head里增加两个标签:
  1. <link rel="canonical" href="http://www.yoursite.com/post-name">
  2. <link rel="shortlink" href="http://www.yoursite.com/?p=postid">
复制代码
这样Google就知道,两个url是同一个页面,并且以http://www.yoursite.com/post-name为主。
注意我上面canonical标签里的post-name、postid只是举例说明,不是通用写法,每个id对应的单页,id和name都不一样,需要修改模板,调用你程序提供的访问这两种url的函数来写)


评分

参与人数 1T币 +2 收起 理由
站群100 + 2 認眞參與

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-24 22:02:10 | 显示全部楼层
本帖最后由 amnoob 于 2014-1-24 22:03 编辑
咚咚来了 发表于 2014-1-24 19:08 求助:Url RewriteRule
1. 第一个问题
你举例说的别人的网站,有可能后面那个就是id, 这也是很常见的一种做法,特别是中文cms, ...

非常非常感谢兄台的再次耐心回复!

我完全是php新手,然后我看着程序里面的其它代码并再三google,学着自己写了个function(由product id提取product name再生成url格式);由于真的是完全新手,由product name生成url弄“ereg_replace”这个地方又折腾了我几个小时,汗,我发誓一定要抽时间好好学学php。

现在我在"_header.tpl"文件<head>里面加入下面代码

  1. {if $detailed}
  2. <link rel="canonical" href="{$setting.site_url}/{$product.id}/{if getProductNameAndFormatForUrl($product.id)}{/if}.html">
  3. <link rel="shortlink" href="{$setting.site_url}/product-details.php?id={$product.id}">
  4. {/if}
复制代码
已经成功实现在产品页面输出

  1. <link rel="canonical" href="http://www.mydomain.com/1392/tao-of-badass.html">
  2. <link rel="shortlink" href="http://www.mydomain.com/product-details.php?id=1392">
复制代码
我详细查看了,所有产品页面都成功了;这样之后是代表以后google只收录一次并且只收录带"canonical"标签的url了吗?并且会将已经用原始url收录了的页面慢慢更新为带"canonical"标签的那个url?




回复 支持 反对

使用道具 举报

发表于 2014-1-24 22:36:23 | 显示全部楼层
本帖最后由 咚咚来了 于 2014-1-24 22:37 编辑
amnoob 发表于 2014-1-24 22:02 求助:Url RewriteRule
非常非常感谢兄台的再次耐心回复!

我完全是php新手,然后我看着程序里面的其它代码并再三google,学着自 ...

不是很清楚已经收录的会怎么样,可以看这个:
  1. https://support.google.com/webmasters/answer/139394?hl=en
复制代码
这个是google官方对canonical的说明。从他的说明来看,同一个网站,即使有重复url指向相同页面, google自己会处理. 貌似不是什么灾难性的问题。
we may index only one version for our search results

另外,实际上shortlink可以不写, 貌似web标准制定shortlink标签的本义是标明短连接, 就是
  1. http://t.co/lny
复制代码
那种.




评分

参与人数 1T币 +2 收起 理由
站群100 + 2 認眞參與

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2014-1-25 08:33:40 来自手机 | 显示全部楼层
新手飘过哈。。。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则