老虎机手机版

<p>欢迎回到第1部分,在那里我详细讨论了如何使用Apache的mod_rewrite模块实现URL重写 - 完成示例重写规则,更常见的正则表达式以及如何使用它们如果你还记得,我刚刚开始进入重写规则对于使用[R = 301]标志的301重定向(顺便提一下,我更喜欢使用RewriteRule指令来设置我的301重定向而不是Redirect,RedirectPermanent或RedirectMatch;稍后会详细介绍)还有另一个方便的指令我经常联合使用使用RewriteCule,称为RewriteCond如果您尝试匹配查询字符串中的某些内容,域名或域名与URL中的问号之间不存在的其他内容(这就是RewriteRule所看到的内容),您将使用RewriteCond )请注意,RewriteRule和RewriteCond都不能访问URL的锚点部分,即#后面的内容,因为它在浏览器内部使用,不会发送到服务器作为请求的一部分以下RewriteCond示例在允许执行后续重写规则之前查找主机名上的肯定匹配:RewriteCond%{HTTP_HOST}!^ www \ example \ com $ [NC] RewriteRule ^(*)$ http:// wwwexamplecom / $ 1 [L,R = 301]让我们解构这里发生的事情对于wwwexamplecom以外的任何主机名,301重定向被发送到www子域上的等效规范URL [NC] flag使重写条件不区分大小写[QSA]标志在哪里,以便保留查询字符串,您可能会问</p><p>重定向时不需要它;暗示如果您不希望在带有重定向的重写规则上保留查询字符串,请在规则中的目标URL末尾添加一个问号,如下所示:RewriteCond%{HTTP_HOST}!^ www \ example \ com $ [NC] RewriteRule ^(*)$ http:// wwwexamplecom / $ 1</p><p> [L,R = 301]注意正则表达式开头的感叹号由重写引擎解释为“NOT”为什么我不使用^ example \ com $</p><p>考虑:RewriteCond%{HTTP_HOST} ^ example \ com $ [NC] RewriteRule ^(*)$ http:// wwwexamplecom / $ 1</p><p> [L,R = 301]因为在例如DNS服务器和虚拟主机将被设置为响应的示例域(例如,拼写错误的域)上没有匹配(假设拼写错误是您注册和拥有的域)在什么情况下我们可能想要从重定向的URL中省略查询字符串,如前两个示例中所做的那样</p><p>需要删除会话ID或跟踪参数(如“source = banner_ad1”)时重定向后保留跟踪参数不仅是不必要的(因为附加源代码的原始URL将记录在您的访问日志文件中因为它正在被访问),从规范化的角度来看,这是不可取的如果你想从重定向的URL中删除跟踪参数,但是在查询字符串中保留其他参数怎么办</p><p>对于静态URL,您就是这样做的:RewriteCond%{QUERY_STRING} ^ source = [a-z0-9] * $ RewriteRule ^(*)$ / $ 1</p><p> [L,R = 301]和动态网址:RewriteCond%{QUERY_STRING} ^(+)&source = [a-z0-9] +(&</p><p>*)$ RewriteRule ^(*)$ / $ 1</p><p>%1%2 [L,R = 301]在重定向用户之前,需要用cookie做一些奇特的东西吗</p><p>调用一个脚本,用户然后将它们填充到规范URL:RewriteCond%{QUERY_STRING} ^ source =([a-z0-9] *)$ RewriteRule ^(*)$ / cookiefirstphp</p><p>source =%1&dest = $ 1 [ L]注意上面没有[R = 301]标志这是故意无需将此脚本暴露给用户使用重写并让脚本本身在完成其工作后发送301其他规范化问题值得通过重写来纠正规则和[R = 301]标志包括引擎索引时:1)HTTPS URL下的在线目录页面,以及2)缺少应该存在的尾部斜杠的URL首先是HTTPS修复:#directirect目录页面中的/ redirect /目录,如果HTTPS RewriteCond%{HTTPS}在RewriteRule上^ catalog /(*)http:// wwwexamplecom / catalog / $ 1 [L,R = 301]请注意,如果您的安全服务器与主服务器分开,则可以跳过RewriteCond上面的行现在附加尾部斜杠:RewriteRule ^(* [^ /])$ / $ 1 / [L,R = 301]默认情况下,WordPress处理丢失的尾部斜杠Yay Wor D按!说到WordPress,您是否知道当您更新已发布帖子上的“post slug”时(即 修改URL),WordPress会自动301将以前URL的所有请求重定向到新的URL吗</p><p>实际上,如果你多次修改post slug,所有之前的迭代将被301响应!并且不会有一系列连接在一起的301系列;只有一个重定向发布到最新的迭代因此,您可以采用持续改进的方法来优化您的URL,使用我在最近专栏中描述的“瘦切片”方法和我的SEO标题标记插件来批量编辑您的所有固定链接帖子URL并让WordPress自动处理301s这是一件很美妙的事情在完成从动态URL迁移到静态的URL重写项目之后,您将希望逐步淘汰动态URL,而不仅仅是替换网站上所有遗留URL,但也可以通过301将旧的动态URL重定向到它们的静态等价物</p><p>这样,指向退役URL的任何入站链接最终都会将蜘蛛和人类引导到正确的新URL - 从而确保新URL是被索引的URL,博客,链接和书签一般来说,这是你如何做到这一点:RewriteCond%{QUERY_STRING} id =([0-9] +)RewriteRule ^ get_product \ php $ / products /%1html</p><p> [L,R = 301]但是,如果你不小心,你会得到一个无限循环的递归重定向避免这种情况的一种快速和肮脏的方法是通过向目标URL添加一个无意义的参数来进行重写和确保在进行重定向之前不存在这个无意义的参数具体来说:RewriteCond%{QUERY_STRING} id =([0-9] +)RewriteCond%{QUERY_STRING}!blah = blah RewriteRule ^ get_product \ php $ / products /%1html</p><p> [L,R = 301] RewriteRule ^ products /([0-9] +)/</p><p>$ / get_productphp</p><p>id = $ 1&blah = blah [L]请注意,我使用了两条RedirectCond线,堆叠在一起在同一个块中一起列出的重定向条件将“同步”在一起如果您希望条件为“ORed”,则需要使用[OR]标志足够重定向让我们继续查找表和RewriteMap,一个指令在你的服务器配置文件中运行的功能(不是htaccess)假设您想要将包含ID号的URL重写为包含关键字的URL一个值得称赞的目标现在让我们假设您的数据库中没有查找表您可以引用一个平面文件 - 以文本或DBM格式(更快) - 包含使用RewriteMap将ID号映射到关键字,然后将RewriteRule基于该平面文件中的数据这是一个假设的查找表:canon-g10-digital- camera / get_productphp</p><p>id = 1001&blah = blah 128-gig-ipod-classic / get_productp hp</p><p>id = 1002&blah = blah这里是相应的RewriteMap和RewriteRule指令的样子:RewriteMap prodmap txt:/ home / someusername / prodmaptxt RewriteRule ^ / products /(+)\ html $ $ {prodmap:$ 1} [L]相反,您需要将所有包含旧ID的URL包含在包含新关键字的URL中,如下所示:RewriteMap prodmap2 txt:/ home / someusername / prodmap2txt RewriteCond%{QUERY_STRING} id =([0-9] + )RewriteCond%{QUERY_STRING}!blah = blah RewriteRule ^ get_product \ php $ $ {prodmap2:%1}</p><p> [L,R = 301]上面相应的查找表(“prodmap2txt”)看起来像:1001 / products / canon-g10-digital-camerahtml 1002 / products / 128-gig-ipod-classichtml你不是限制为文本或DBM文件您也可以安装一个脚本来查找重写规则捕获到内存中的内容(在括号之间),然后将相应的目标传递回重写引擎这里是针对这样一个实例的略微修改的RewriteMap:RewriteMap prodmap prg:/ home / someusername / mapscriptpl RewriteRule ^ / products /(+)\ html $ $ {prodmap:$ 1} [L]关于另一个问题让我们说你想重写一个位于另一台服务器上的URL你可以做它带有[P]标志“P”代表“代理”例如,您可以使用以下重写规则代理服务器上的Google主页(无图像):RewriteRule / google \ html $ http:// wwwgooglecom / [P,L]没有[P]标志,上面的重写规则就像红色一样如果您的服务器运行Microsoft IIS Server而不是Apache,您可能想知道如何完成所有这些魔法如我在第1部分中提到的那样,mod_rewrite和ISAPI_Rewrite之间的规则没有太大差别 例如,不是使用“RewriteEngine on”初始化事物,而是在httpdini文件的第一行指定“[ISAPI_Rewrite]”而不是[R = 301],您将使用[RP]发出301而不是[ NC]对于不区分大小写,你会使用[I]依此类推最简单的方法是通过一些说明性的例子:#Capitalization和IIS'对URL的不敏感性RewriteRule(*)http:// wwwexamplecom $ 1 [I ,RP,L]#非www和错字域RewriteCond主机:(</p><p>!www \ example \ com)RewriteRule(*)http:// wwwexamplecom $ 1 [I,RP,L] #Drop“默认”RewriteRule(* )/ defaulthtm $ 1 / [I,RP,L] #Add尾部斜线如果缺少RewriteCond主机:(*)RewriteRule([^</p><p>] + [^</p><p>/])http \:// $ 1 $ 2 / [I,RP ,L]在本文开头,我承诺我们会重新考虑我的理由,为什么重写规则是我重定向的首选方法,因为与Redirect,RedirectPermanent和RedirectMatch E相比,RewriteRule是如此强大和灵活</p><p>尽管RedirectMatch支持正则表达式,但它并不提供与RewriteRule和RewriteCond相同的功能集,但是,您可能位于没有安装/启用mod_rewrite的Web主机或服务器上</p><p>如果是这种情况,它可能会有助于查看这些替代指令的一些示例,可以在htaccess或httpdconf中使用:#301个人URL重定向301 / old_urlhtm http:// wwwexamplecom / new_urlhtm#301目录的内容重定向301 / old_dir / http:// wwwexamplecom / new_dir /#301整个域重定向301 / http:// wwwexamplecom#删除子目录末尾的indexhtml和301 RedirectMatch 301 ^ /(+)/ index \ html $ http:// wwwexamplecom / 1美元/这就是我所拥有的 - 现在我保证在下一篇文章中我不会太惹人注意如果你一直陪着我,你应该得到一个饼干在下次会议上打我,我会刷卡一个给你的演讲者休息室意见表达了这一点文章是客座作者的文章,