使用WordPress固定链接

14条评论

固定链接(Permalink)是博客日志、分类及其他博客内容列表的永久URL。其他博客主人可以使用固定链接链接到你的文章上,你也可以在email中发送某篇日志的链接。所有日志的URL应为永久性、固定不变的-这就是所谓的固定链接。

固定链接类型

WordPress固定链接有三种基本类型:

默认类型:"不美观"

默认形式

http://example.com/?p=N

这里的N是Post ID号。它能够在所有服务器环境下使用,但这种形式的URL看起来不是很好看。

mod_rewrite类型:"美观的固定链接"

这些固定链接样式可谓浅显易懂、赏心悦目。虽然这种链接的格式多种多样,但最常见的形式还是

    http://example.com/category/post-name/  
或  http://example.com/year/month/day/post-name

某些用户移除了日期元素(日,月,年)以使得永久链接格式变得更精简。

美观的固定链接可在以下环境中工作:

  • 具有mod_rewrite模块的Apache网络服务器
  • Microsoft IIS 7 + 带有URL Rewrite 1.1的网络服务器 + 作为FastCGI运行的模块与PHP5
  • 使用404处理程序或 mod_rewritemod_magnet 的Lighttpd

PATHINFO:"近乎完美"

PATHINFO 固定链接形式跟mod_rewrite 固定链接形式很相像,只有一点不同:前者插入了 /index.php ,如下:

http://example.com/index.php/yyyy/mm/dd/post-name/

除此之外,PATHINFO就跟mod_rewrite 固定链接一样完美了,其灵活性也很相似。mod_rewrite 固定链接所能达到的效果,PATHINFO 固定链接通过/index.php部分也能做到。

有一个插件可以显示处于使用中的固定链接类型,以及WordPress使用的内部重写规则相关详细信息。

选择永久链接的结构

你可以在设置>固定链接面板(WordPress2.5之前的版本中是选项 >固定链接)中选择常见固定链接的结构,或是使用结构标签在"自定义结构"中输入自定的结构。

使用index.php/作为固定链接结构的开头来启用PATHINFO固定链接。

 

结构标签

你可以用下面这些标签来定制“美观”或者“接近美观”的固定链接。这里有一些注意事项:

  • 确保用 %post_id% 或%postname% 结束结固定链接结构(如/%year%/%monthnum%/%day%/%postname%/)),这样每个固定链接都会指向一篇独立的日志。
  • 考虑到运行上的问题,最好不要以分类、标签、作者或是日志名字段作为固定链接结构的开始。这是因为这些都是文本字段,如果以文本字段作为固定链接结构的起始部分,WordPress需要花更多时间来判断这是一个日志的URL还是页面的URL(页面URL总是使用“页面别名”作为URL),为了作为补偿,WordPress在数据库中存储了大量额外信息(信息数量之庞大直接影响到了具有多个页面的网站的运行)。因此,最好以年份或日志ID等数值型字段开始你的固定链接结构。参见WordPress测试者对这个问题的讨论

%year%

日志发表的年份,四位数字,如2009

%monthnum%

日志发表的月份,如05

%day%

日志发表的日期,如28

%hour%

日志发表的时间(小时),如15

%minute%

日志发表的时间(分钟),如43

%second%

日志发表的时间(秒),如33

%postname%

日志标题的缩略版本(日志/页面编辑界面上的日志别名)。因此“This Is A Great Post!”在URI中会变成this-is-a-great-post。

%post_id%

日志的唯一ID,如423

%category%

分类名称的缩略版本(添加新分类/编辑界面上的分类别名)。嵌套的子分类会作为嵌套子目录出现在URI中。出于运行方面的考虑,不推荐以%category%作为固定链接的起始部分。

%tag%

标签名称的缩略版本(添加新标签/编辑界面上的标签别名)。出于运行方面的考虑,不推荐以%tag%作为固定链接的起始部分。

%author%

作者名称的缩略版本。

分类库和标签库

分类库和标签库是用在分类和标签存档URL中的前缀,类似于:

example.net/wp/category_base/category_name
example.net/wp/tag_base/tag_name

其默认值分别为分类和标签。你可以更改默认值,但不能将它们从URL中移除。

自定义固定链接可以在很多系统中无障碍运行,但在某些条件下会出现一些意外情况。

为具有多个分类(标签)的日志URL使用%category%(%tag%)

当你为一篇日志设定多个分类时,日志链接中只能显示其中一个分类ID最小的分类名(参见 文章>分类目录)。但通过其他分类也可以找到该日志。

对标签来说,情况也是如此。

使用“美观”的固定链接

必要条件

  • 具有mod_rewrite模块的Apache网络服务器
  • 在WordPress主目录下
    • 激活 FollowSymLinks选项
    • 允许FileInfo directives(如 AllowOverride FileInfo 或 AllowOverride All)
    • 一个.htaccess文件(若该文件缺失,WordPress会尝试在用户激活美观的固定链接时创建一个新文件)
    • 如果你希望WordPress自动更新.htaccess文件,需要为WordPress赋予该文件的写入权限
  • 关于Lighttpd,请参见文章结尾部分的外部资源。

当你新建或更新了一个“漂亮”的固定链接结构后,WordPress会生成重写规则并尝试将重写规则插入适当的.htaccess文件。如果WordPress无法将重写规则插入.htaccess文件,就会显示You should update your .htaccess now(请立即升级你的.htaccess文件)这样的信息,然后输出重写规则,让你复制并粘贴到文件中(将规则置于文件结尾处)。

在WordPress 2.0以及更高版本中,你可能只需要执行一次以上动作,因为WordPress会在内部运行重写规则。如果移动了WordPress主目录的地址(博客地址),就需要重复以上动作。

WordPress会与已有的.htaccess文件合作愉快,也不会删除任何已存在的重写规则或其他指令。如果你有其它mod_rewrite规则,请将你的规则优先于WordPress生成的mod_rewrite规则。

我的.htaccess文件在哪?

WordPress博客的index.php和.htaccess文件都应该位于用户在设置>常规菜单中设置的博客地址(URI)文件夹下。由于.htaccess文件的文件名是以一个句点开始的,你可能无法通过FTP客户端查看该文件,除非事先修改FTP工具的首选项,使之显示包括隐藏文件在内的所有文件。一些虚拟主机(如Godaddy)不允许那些通过Godaddy Hosting Connection安装WordPress的用户查看或编辑.htaccess文件。

新建与编辑.htaccess文件

如果你还没有.htaccess文件,请先新建一个。如果有对服务器的shell或ssh权限,只要通过一个简单的touch.htaccess命令就可以新建一个.htaccess文件。如果你用FTP传输文件,可以在本地机器上新建一个.htaccess文件,命名为1.htaccess,将1.htaccess上传到WordPress文件的根目录下,然后重命名为.htaccess。

可以通过FTP、shell或(可能)你的虚拟主机的控制面板编辑.htaccess文件。

如果你的.htaccess文件中含有可导致网站瘫痪的错误("Internal Server Error (500)"),需要用FTP或虚拟主机的控制面板删除流氓.htaccess文件。

自动更新.htaccess文件

如果WordPress无法自动更新你的.htaccess文件,它就会在设置>固定链接菜单的下方显示If your .htaccess file were writable, we could do this automatically, but it isn’t… (如果你的.htaccess文件是可写入的,我们可以帮你自动更新,但你的.htaccess文件无法写入)这样的信息。

如果你希望WordPress自动更新.htaccess文件,需要为WordPress赋予该文件的写入权限。必要的权限取决于你的服务器设置。试着赋予owner(所有者)写入权限,然后赋予组(group),接着服务world写入权限,每修改一次权限都需要进行一次测试;一旦WordPress能够成功编辑文件,就无需再额外增加权限。

使用固定链接后,应该将权限加强为660或644等,阻止服务器上其它用户的访问。

不使用mod_rewrite的固定链接

“漂亮的”固定链接通常会要求使用mod_rewrite,而IIS(常见于Windows服务器)却不支持mod_rewrite。(如果你在Windows上使用Apache 2.0.54,mod_rewrite可能会运行,前提是要在apache\conf\httpd.conf.中激活mod_rewrite)。

使用IIS 7并具备服务器管理权限时,可以使用Microsoft的URL重写模块来代替mod_rewrite。虽然IIS 7不完全兼容mod_rewrite,但它支持WordPress的固定链接。Microsoft的URL重写模块安装完毕后,在WordPress目录下打开web.config文件,将以下规则添加到system.webServer 元素中:

<rewrite>
<rules>
<rule name="Main Rule" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php" />
</rule>
</rules>
</rewrite>

IIS网站上有一份关于Microsoft的URL重写模块详细的安装指南,该模块可用于 x64x86系统。

如果这个方法行不通,还可以试试PATHINFO链接;将index.php/放在自定义链接结构的开始部分前:

/index.php/%year%/%monthnum%/%day%/%postname%/  

这个方法并不总能成功,尤其是用在运行于ISS 6上的WordPress时。要让这方法运行在IIS上,需要将以下两行代码添加到php.ini文件并将文件保存在网络根目录下(http://blog.taragana.com/index.php/archive/wordpress-tip-on-permalink-options):

cgi.fix_pathinfo = 1
cgi.force_redirect = 0

另一种解决方法是利用IIS的自定义404重定向。这要求你的虚拟主机允许你添加自定义404重定向,不过这并不需要你安装任何第三方mod_rewrite软件,也不需要你的固定链接结构以/index.php/开头。

如果你具备对服务器的管理权限,可以尝试以下解决方案:

修复固定链接问题

修正生成.htaccess时产生的问题

如果你的WordPress不生成.htaccess文件,或者不为已有的.htaccess文件写入新的规则,原因可能有很多种。请根据下面的介绍进行操作,如果某步骤无效,再进入下一步骤。

1. 更改文件权限:必须要将.htaccess文件的权限改为666,然后用WordPress模板编辑器编辑该文件,但我们不推荐你这样操作,如果你用模板表及其编辑.htaccess,那么你博客上所有有权编辑模板的用户都可以编辑你的.htaccess文件了。可以将文件的权限改为666,使文件可被服务器写入,这样也可以达到同样的保护效果。

2. 服务器阻塞:你的虚拟主机可能锁定了server_SOFTWARE变量,导致WordPress无法生成.htaccess文件。如果你确定自己的服务器运行了Apache,可以更改wp-includes/vars.php文件,强制命令WordPress相信你的服务器运行了Apache。根据以下操作说明更改wp-includes/vars.php文件。

  • 编辑wp-includes/vars.php文件。在文件中找到:

$is_apache = strstr($_SERVER['SERVER_SOFTWARE'], 'Apache') ? 1 : 0;

并用以下代码取代:

// $is_apache = strstr($_SERVER['SERVER_SOFTWARE'], 'Apache') ? 1 : 0;
  • // $is_apache = strstr($_SERVER['SERVER_SOFTWARE'], 'Apache') ? 1 : 0;

    下添加一个空行,输入:

    $is_apache = 1;

3. XAMPP(Windows)用户:有些 XAMPP版本默认状态下没有激活mod_rewrite(尽管这是用Apache编译的)。要激活mod_rewrite——并且激活WordPress写入.htaccess文件(用以创建美观的固定链接)——你需要打开apache/conf/httpd.conf ,取消对代码行LoadModule rewrite_module modules/mod_rewrite.so的注释标记(如,删除代码行前的#符号)。

固定链接、.htaccess文件与MS Frontpage

关于Microsoft Frontpage:很多由虚拟主机服务提供商建立并维护的服务器(包括共享服务器和专用服务器)都配备有apache构建的mod_frontpage,大多数情况下每个虚拟服务器上都安装了Front Server Extensions服务器扩展选件。而如今大多数虚拟主机商用在服务器创建过程中的二进制发布包都同时包含了mod_frontpage和服务器扩展。由于插件和apache(以及httpd.conf文件)的交互方式,即使你不使用Frontpage,如果你试图查看自己的WP安装,也有可能发生500错误或看到空白页面,这是因为你的服务器上有extensions/mod_frontpage存在。

WordPress会和已安装的Frontpage扩展选件合作顺利,但固定链接却不能正常运行,由于.htaccess文件中附加的mod_rewrite规则,在WordPress管理面板对固定链接菜单进行任何改动都会导致Frongpage服务器扩展选件无法运行。幸好有一个方法可以解决这个问题

快速修复Frontpage或固定链接

修复Frontpage扩展选件:如果你不在意固定连接,只希望MS Frontpage服务器扩展选件能够正常运行,只要编辑.htaccess文件并删除WordPress部分的重写规则就可以了。

使用固定链接:如果不在意Frontpage是否能够正常运行(但虚拟主机商安装了Frontpage扩展选件),你需要删除(或者让你的虚拟主机商删除)MS Frontpage服务器扩展选件,也可以编辑.htaccess文件来删除所有Frontpage代码行,只留下WordPress的mod_rewrite代码。

同时使用Frontpage与固定链接

这是最终的解决方案

WordPress支持论坛上有很多关于同时使用Frontpage和固定链接的讨论,但迄今为止,仍然没有得出一个行之有效的解决方案。

正常情况下,在安装了Microsoft Frontpage服务器扩展选件的Unix服务器中,WordPress完全能够正常运行,你也可以(用 Microsoft FrontPage)编辑并发布各种页面——直到——你对固定链接做了修改(比如将固定链接更改成基于日期索引的类型,/2009/04/)。用固定链接举例时,我们总是用日期类型的链接,因为这是W3C推荐的用法(参见 http://www.w3.org/Provider/Style/URI)。

现在的问题是,Frontpage将.htaccess文件(WordPress的mod_rewrite规则必须访问的文件)用于“发布”和“网络编辑”。WordPress的mod_rewrite代码被添加到.htaccess文件后,会导致两种后果——一是固定链接无法发挥作用,二是Frontpage服务器扩展选件瘫痪。

有人曾经尝试使用可“忽略”Frontpage的%{HTTP_USERAGENT)% 的重写规则,对httpd.conf文件使用另一个AccessFilename .wpaccess文件,并进行其它设置,但这样也没有任何效果。

直到一次偶然的情况下,我们发现了一种非常简单的解决方法。

如果有WordPress用户希望使用或正在使用Frontpage(或者你购买的虚拟主机套餐预先配置了Frontpage),请在服务器上进行以下操作或让你的虚拟主机商为你进行以下操作。

Microsoft Frontpage创建了下面这个文件夹:

_vti_bin

在文件夹中还嵌套创建了:

_vti_adm

_vti_aut

在以上文件夹中,除了能看到你的网站(或WordPress)根目录外,还能看到其它.htaccess文件。

在以上三个文件夹与根文件夹中,在所有.htaccess文件的最上方添加以下代码:

Options +FollowSymlinks  

文件夹中可能已经有(也可能还没有)下面这行代码:

Options None

编辑并保存所有.htaccess文件,完成!之后包括Frontpage和固定链接在内的每个程序都能正常运行了。

长长的固定链接

如果电子邮件、评论、聊天的内容中包含过长的固定链接地址,其中一些固定链接可能会被“切断”,或只有前半部分被系统看成是链接,后半部分则被看成了文本信息。例如,

http://yourdomain.example.com/2005/10/4/article-about-joe-fred-sally-and-bog

可能会被看做:

http://yourdomain.example.com/2005/10/4/article-about-joe-fred-sally-and-bog

点击下面的链接,显示404错误页面——页面未找到。如果你想使用含有较长日志标题的固定链接,请根据以下步骤进行操作,避免上述情况发生。

1. 确定你的确在使用固定链接

2. 编辑.htaccess文件,在其中添加以下内容:

 RewriteRule ^post/([0-9]+)?/?([0-9]+)?/?$ /index.php?p=$1&page=$2 [QSA]  

3. 进行测试。选择某篇日志的ID,在浏览器中输入以下内容(将其中的yourdomain替换成你的域名,the ID #改为你选择的日志ID),页面跳转到所选日志页面则表示测试成功:

http://yourdomain.example.com/post/(the ID #)  

大多数e-mail软件不会切断带有尖括号(<与>)的链接URL,因此如果要在e-mail中复制URL地址,应使用以下格式:

欢迎阅读我的新日志 <http://yourdomain.example.com/2005/10/4/article-about-joe-fred-sally-and-bog>

此外,一些先进的电子邮件客户端还为编写纯文本格式邮件的用户提供了一个“预编排格式”的选项。复制链接地址时如果使用“预编排格式”,电子邮件客户端就不会在链接中插入换行符了。

修正其它问题

如果生成的.htaccess文件没有问题,但固定链接仍然无法使用,可能是出于下面这些原因。如果仍然不能解决问题,请访问WordPress论坛寻找帮助。

未激活AllowOverride

无法使用固定链接,可能是因为你的服务器可能没有激活AllowOverride指令。如果Apache 的httpd.config文件中AllowOverride指令被设为None,那么.htaccess文件会被彻底忽略,这时服务器就不可能在文件系统中读取.htaccess文件。而当AllowOverride指令被设为All时,.htaccess文件会许可所有带有.htaccess Context的指令。

在httpd.config中激活的AllowOverride指令:

<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>

你可能还需要在文件根目录下激活AllowOverride指令:

<Directory /var/www/html>
# ... other directives...
AllowOverride All
</Directory>

此外还需要更改网站的AllowOverride设置,尤其是在使用Mac OS X服务器时,不过使用其它操作系统可能也是同样的情况。通常能在/etc/httpd/sites/中找到网站的配置文件。

如果不希望将AllowOverride设为All,那么你的AllowOverride列表中必须包括FileInfo指令。此外还需重启Apache服务器,使对httpd.config的改动生效。更多关于许可重写规则的信息请见Apache Core Features

分页导航无法工作

日志的分页导航有时不能正常工作。日志会生成一个带有以下URI的页面链接:

http://www.example.com/page/2/
http://www.example.name/category/categoryname/page/2/
http://www.example/year/month/day/page/2/
http://www.example/year/month/page/2/

点击其中任何一个链接,页面上会出现所有周围元素(页头、页脚、边栏),唯独缺少正文部分,显示在页面正文部分的是一个错误信息:“对不起,没有找到符合要求的日志。”

这是由WordPress生成的.htaccess文件中的小错误导致的。要修正这个小错误,你需要删除.htaccess文件中的内容,再重新创建一个.htaccess文件。

1. 在本地机器上找到.htaccess文件

2. 复制文件内容并粘贴到文本编辑器中,保存为文本文件。这是一个预防措施,防止重定向、拒绝访问等htaccess手段在.htaccess文件中手动输入内容。

3. 删除.htaccess文件中的内容并保存,将文件上传到FTP客户端。

4. 进入你的WordPress网站的管理界面,选择设置>固定链接

5. 点击“保存更改”,为固定链接重新生成重写规则

6. 访问之前出错的链接,测试操作成果。

7. 登录FTP,在.htaccess文件中添加手动输入的内容(将手动条目放置在 # BEGIN WordPress版块前或# END WordPress版块后。)

也可以从服务器删除.htaccess文件,新建一个空的.htaccess文件,将文件权限改为666,然后点击设置>固定链接中的“保存更改”,生成新的htaccess规则。

如果仍然不起作用,可以看看WordPress论坛上的这篇帖子

页面的固定链接无效

是不是厌倦了“访问新建页面→遇到错误”这样的过程呢?其实你可以更新固定链接结构,然后再也不必为此烦恼。记住,每次在WordPress网站上添加新的静态页面时,都需要生成新规则并添加到.htaccess文件中(WordPress 1.X系列中)或者添加到内部重写数组中(WordPress 2.X系列中)。

Ultimate Tag Warrior标签页面的固定链接无效

在WordPress 2.X系列版本中使用Ultimate Tag Warrior插件,有时访问本地标签链接会遇到404错误,这是因为WordPress生成的内部重写规则过于“贪婪”,在插件的重写规则还没有来得及运行前便横加干涉。不过这种情况通常只会发生在自定义固定链接结构中(如/%postname%/)。要修正这个问题,可以将固定链接结构改为“日期和文章名”,也可以修改Ultimate Tag Warrior插件,将其重写规则存放在内部重写数组的最上方。更多信息请看这里

可使用固定链接,但没有页面返回

PHP 4.4.x与PHP 5.x中有些版本会有一个bug:使用Apache 2.x版本系列时,mod_rewrite无法运行。详情请看http://bugs.php.net/bug.php?id=35096http://bugs.php.net/bug.php?id=35059

更多帮助

如果以上方法都不能使固定链接恢复正常,请在WordPress手册疑难解答论坛中查找答案。实在无计可施时,可以向WordPress提交bug报告。

使用技巧

如果想让自己的网站出现在Google新闻列表中,首先你的网站需要符合一个必要条件:每个链接结尾都应该带有一个至少有三位数字的标识符。

利用 %postname%-%post_id% 结构可以轻松满足这个条件,该结构在URL结尾部分加上日志ID,使URL结构格式成为:http://你的网站名.com/cooking-tips-tricks-344

以.html作为日志URL的结尾

利用上面提到的结构标签可以快速让你的日志以.html为扩展名。根据上文中结束固定链接的示例进行操作,就会得到一个链接为 http://yoursite.com/2006/01/01/happy-newyear.html的页面,该页面的重写规则为:

 /%year%/%monthnum%/%day%/%postname%.html  

注意,这不会生成静态的.html文件。只会为日志添加.html扩展名,网页仍然是动态生成的。可能有人会争论这种操作是否有利于SEO,但为日志添加.html扩扎名后,页面可以迅速转换为静态页面却依然保留URL结构。

避免日志链接被解析成存档链接

类似于 %年r%%月%%日%的链接结构可能会被看成是那一天的日志存档链接(如果当天有一篇以上的日志发表),因此至少需要使用 %年%%月%%日%%小时%来作为单篇日志的链接。

检查固定链接结构

有一种方法可以查看网站是否有固定链接:

if ( get_option('permalink_structure') != '' ) { echo 'permalinks enabled' }

参见

内容链接

外部资源

#1
学习了啊
#2
/%category%/%postname% 想用这个啊!
#3
学习了!
#4
用%postname%生成的中文连接只是一串乱码,怎么办?
#5
那是因为你标题是中文,你发表文章的时候点编辑自定义一个英文的就行了
#6
你好,我修改了固定链接 在分类目录后面添加了一个斜杠 可是,现在的情况是 不管是文章页,还是目录页 后面都有一个斜杠了 请问这样会有不好的影响吗
#7
准备使用wordpress,弄了好几个晚上都不能实现伪静态,用的是win主机,不知道怎么回事?
#8
已经用了默认固定链接了,还能再改?
#9
我在wordpress里把设置-常规里的两个URL加上了www(原来是没有www的)之后,除了首页,其他的页面都变成404页面了,请问这样是什么原因造成的啊?
#10
文章技术含量很高,就是太长了,很多人没耐心读完。影响了读者的体验度。