amnoob 发表于 2014-1-20 13:22:54

求助:Url RewriteRule

本帖最后由 amnoob 于 2014-1-20 13:25 编辑

不懂程序就是麻烦啊,:'(:'(:'(

求一条RewriteRule的写法:
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^(.*).html$ $1.php
RewriteRule ^(+)/(.*)$ product-details.php?id=$1    
输出Url:http://www.mydomain.com/1392/tao-of-badass.html
RewriteRule ^(.*)/(.*)$ product-details.php?id=$1
输出Url:http://www.mydomain.com/1392/tao-of-badass.html求助:要怎么写才能让Url把”product id“也省了啊,让它直接输出http://www.mydomain.com/tao-of-badass.html

熟能生巧哇 发表于 2014-1-20 14:28:33

ID 貌似不能去啊 去了 apache或者NGINX就不知道具体是什么网址了

leevans 发表于 2014-1-20 14:57:10

ID不能去掉,可以移动到文件名后面

风吹不动 发表于 2014-1-20 15:01:36

看你的程序是否支持通过文件名获取文章


amnoob 发表于 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怎么写啊 :Q

咚咚来了 发表于 2014-1-20 15:22:15

应该不是apache rewrite单独完成的,还需要你用的程序的url route配合。仔细看看你的程序有没有friendly url设置

amnoob 发表于 2014-1-23 14:37:56

咚咚来了 发表于 2014-1-20 15:22 static/image/common/back.gif
应该不是apache rewrite单独完成的,还需要你用的程序的url route配合。仔细看看你的程序有没有friendly ur ...


多谢!

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

咚咚来了 发表于 2014-1-24 13:16:24

本帖最后由 咚咚来了 于 2014-1-24 13:18 编辑

amnoob 发表于 2014-1-23 14:37 static/image/common/back.gif
多谢!

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

不过web程序都一个道理。 apache rewrite只是简单地映射, 就比如你主楼帖子写的例子,把用户请求的url:http://www.mydomain.com/1392/tao-of-badass.html映射成: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”。







amnoob 发表于 2014-1-24 15:14:15

咚咚来了 发表于 2014-1-24 13:16 static/image/common/back.gif
不清楚你用的什么程序。

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

非常感谢!

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

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

再请教一下兄台哦:

我现在好多页面都被google重复收录了两次,因为我自己站内url是用
RewriteRule ^(+)/(.*)$ product-details.php?id=$1

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

外链站因为是rss订阅的,用的是程序的原始url即
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应该怎么写呢?

我想当然地以为是
RewriteRule ^product-details.php?id=(+)$ (+)/$1
结果不行啊.


咚咚来了 发表于 2014-1-24 19:08:25

本帖最后由 咚咚来了 于 2014-1-24 19:13 编辑

amnoob 发表于 2014-1-24 15:14 static/image/common/back.gif
非常感谢!

我看了一下,我的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 。
只需一条:Options +FollowSymLinks
RewriteEngine On
RewriteRule ^(.*)-(+)\.html$ product-details.php?id=$2 但是这有个前提,就是你能把你网站的URL格式设置成 yousite.com/XXXXX-xxx.html 的形式(大写XXXX代表类似的“tao-of-badass”的东西,小写xxx代表类似1392的id), 不然用户根本得不到这种形式的url,更不用说通过浏览器访问了。


2. 第二个问题URL形式 A:
http://www.mydomain.com/product-details.php?id=1392URL形式 B:
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是这样的:http://www.yoursite.com/?p=postid

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

http://www.yoursite.com/tao-of-badass这样就有两个url,一个是原生url,另一个是“搜索引擎友好的”或者“用户友好的”url,但是都指向同一个页面。为了告诉搜索引擎只收录“友好的”url,可以修改模板,在单页模板的html head里增加两个标签:<link rel="canonical" href="http://www.yoursite.com/post-name">
<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的函数来写)


amnoob 发表于 2014-1-24 22:02:10

本帖最后由 amnoob 于 2014-1-24 22:03 编辑

咚咚来了 发表于 2014-1-24 19:08 static/image/common/back.gif
1. 第一个问题
你举例说的别人的网站,有可能后面那个就是id, 这也是很常见的一种做法,特别是中文cms, ...
非常非常感谢兄台的再次耐心回复!

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

现在我在"_header.tpl"文件<head>里面加入下面代码
{if $detailed}
<link rel="canonical" href="{$setting.site_url}/{$product.id}/{if getProductNameAndFormatForUrl($product.id)}{/if}.html">
<link rel="shortlink" href="{$setting.site_url}/product-details.php?id={$product.id}">
{/if}
已经成功实现在产品页面输出
<link rel="canonical" href="http://www.mydomain.com/1392/tao-of-badass.html">
<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 static/image/common/back.gif
非常非常感谢兄台的再次耐心回复!

我完全是php新手,然后我看着程序里面的其它代码并再三google,学着自 ...
不是很清楚已经收录的会怎么样,可以看这个: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标签的本义是标明短连接, 就是http://t.co/lny那种.




wise2013 发表于 2014-1-25 08:33:40

新手飘过哈。。。。。。
页: [1]
查看完整版本: 求助:Url RewriteRule