如何在URL重写中使用外部信息?

时间:2011-11-06 21:17:21

标签: wordpress .htaccess url mod-rewrite rewrite

希望你们中的一些.htaccess大师可以帮助我解决这个问题。我以前从来没有花时间搞过.htaccess,所以我有点失落。

基本上我想要一个像这样的链接   example.com/index.php?id=3并将其转换为http://example.com/pagename/

我可以很容易地改变它,以便链接转换为http://example.com/directory/3或类似的东西,但我真的不明白人们如何完成我正在寻找的改变。我知道Wordpress与他们的网址类似,但他们如何访问帖子名称信息?

1 个答案:

答案 0 :(得分:0)

Wordpress通过将所有未解析为文件或目录的内容重写为index.php来实现,它看起来像这样:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

index.php读取请求的URI并确定如何处理它。同时,wordpress知道这些URL正在被重写,因此它会呈现具有干净SEO友好URL的页面,如http://example.com/pagename/

对于您的示例,除非您对一堆单独的RewriteRules进行硬编码,否则mod_rewrite本身无法知道 id = 3 等同于 pagename 。您可以做什么使index.php接受 pagename ,因此您的规则将如下所示:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ /index.php?page=$1 [L]

现在可以在您的内容中生成干净的SEO友好URL。在内容管理系统中,页面本身通常以某种ID存储在数据库中。在2011年10月10日创建一个“测试页面”页面,其数据库中的ID为“5”。当​​CMS需要生成链接时,它会查找数据库并将链接构建为/2011/10/Test_Page

因此,当您转到首页时,index.php会生成指向其所有页面的链接,而“Test Page”会链接显示/2011/10/Test_Page,当有人点击该链接时,apache会使用像RewriteRule ^([0-9]+)/([0-9]+)/(.+)$ /index.php?year=$1&month=$2&title=$3 [L]这样的规则会将网址重写为/index.php?year=2011&month=10&title=Test_Page。 index.php脚本在数据库中查找正确的页面并将其返回给浏览器。每个CMS都会有所不同。从本质上讲,.htaccess不会知道存储在数据库中的任何内容,但它可以重写链接,以便将所需信息(如“id”或“page”)传递给脚本。由脚本决定返回哪个页面以在该页面上生成干净的SEO友好链接。