通过Wordpress Rewrite或.htaccess重写URL

时间:2013-05-21 07:37:31

标签: wordpress .htaccess url-rewriting

跳到编辑8看我如何解决这个问题


假设我有一个Wordpress博客:www.animals.com。我的主题目录中有一个PHP文件:www.animals.com/wp-content/themes/mytheme/db.php。此外,我有一个该页面的自定义模板,因此我在Wordpress管理面板中创建了一个新页面,以显示db.phpwww.animals.com/database

因此,如果我想阅读有关狮子的内容,我只需转到:www.animals.com/database/?animal=lion(因为这是我决定编写PHP的方式,将$ _GET ['animal']的值插入到查询中,使用PDO等。)。

现在,我想以www.animals.com/database/?animal=lion的身份访问www.animals.com/lion

我应该使用.htaccess还是Wordpress Rewrite?我应该将我的.htaccess放在Wordpress文件夹的根目录中(使用wp-config.php和那些文件)还是放在我的主题目录中?

默认情况下,来自root的那个有RewriteBase /和来自Wordpress的东西。我应该写什么来实现我想要的?我应该把它放在现有代码之前还是之后?

编辑:这是我的 public_html .htaccess,这是我真正想做的事情: 我有一个网站:www.domain.com,当您输入此http://www.domain.com/dios/?dios=agni时,它会向您显示有关神Agni的信息。我想输入www.domain.com/dioses/agni来访问有关神Agni的信息。 PHP文件位于www.domain.com/wp-content/themes/smitespain/dios.php 这不起作用x_x

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^dioses/(\w*)$ dios/?dios=$1 [NC,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

EDIT2 :我正在使用多站点(检查EDIT4),同样,/ database / / dios /和/ dioses / 我创建的实际文件夹,这是我在Wordpress中创建的页面的名称。问题是,现在它在标签标题中显示了神的名字:S表示变量$ _GET ['dios']已设置,但它不加载文件(dios.php)= /

EDIT3 :我需要专门访问domain.com/dios/?dios=agni,因为那是让PHP文件(dios.php)从wordpress加载get_header()的URL ,所以我无法直接访问该文件

EDIT4 :我决定删除多站点内容

EDIT5 :这些是我的Wordpress页面: domain.com/dioses/的{​​{1}} (www.domain.com/wp-content/themes/smitespain/dioses.php)

domain.com/dios/?dios=thor

EDIT6 :我正在阅读wordpress codex中的内容。并意识到,如果我想转到(www.domain.com/wp-content/themes/smitespain/dios.php),我可以访问domain.com/dioses或{ {1}}
所以,我在domain.com/index.php?pagename=dioses和下一条规则之间添加了此内容:domain.com/?pagename=diosesRewritebase /将我重定向到RewriteRule example/test ?pagename=dioses,但它也更改了地址栏中的网址:(
问题是,如果我尝试这个:domain.com/example/test它会将我发送到'dios'页面,而不是'?dios = thor'

EDIT7 :我开始使用wordpress重写,我将其添加到我的主题函数中.php:

domain.com/dioses

再次..加载页面dios,没有?dios = agni

EDIT8 :最后,我设法让它工作=)
我需要知道的第一件事是,新RewriteRule example/test ?pagename=dios&dios=thor将不再可用于function my_rewrite_rules() { add_rewrite_rule( 'blah', 'index.php?pagename=dios&dios=agni', 'top' ); } add_action( 'init', 'my_rewrite_rules' ); ,而是需要调用?dios=XXXX,所以我将其添加到我的主题的functions.php

$_GET['dios']

我确保$wp_query->query_vars['dios']实际设置为
然后我只添加常规规则

4 个答案:

答案 0 :(得分:3)

还有另一种解决方法,无需触及WordPress。

添加到.htaccess

RewriteRule ^lion /indexw.php?pagename=db&dios=$1 [L,E=URI:/detail/]

创建文件indexw.php:

<?php $_SERVER["REQUEST_URI"] = $_SERVER["REDIRECT_URI"]; include("index.php");

它是如何工作的? mod_rewrite按照E = URI:value参数中的指定设置REDIRECT_URI。 indexw.php只是用正确的值覆盖REQUEST_URI(感谢Ravi Thapliyal对此有所了解)

答案 1 :(得分:1)

WordPress将根目录的全局重定向放在未识别的所有内容上,即不是现有文件或其/index.php的文件夹。另一方面,您现在想要将它们重定向到?animal=unidentified。因此,除非修复动物关键字列表,否则任何提议的解决方案都可能会破坏您的WordPress。

如果你喜欢10多只动物,你可以将它们添加到你的.htaccess(在root /)

RewriteEngine on
RewriteBase /

RewriteRule ^(lion|leopard|tiger|dog|cat)/?$ database/?animal=$1 [NC,L]

# WordPress rules come here

对于40多只动物,我建议你为你的动物设一个目录(不需要存在)。

RewriteRule ^a/(.+?)/?$ database/?animal=$1 [NC,L]

这会将任何/a/critter重定向到database/?animal=critter,您不必再手动将它们添加到.htaccess中。您也可以将两个规则共存,这样如果您尚未修改/panther的.htaccess,但仍可以/a/panther访问它。

修改
好的,我调查了它,如果没有编写PHP脚本来拦截此请求并将其转发到index.php,则无法实现。以下是mutisite的工作原理:因为,你的重写没有一个匹配到index.php; WordPress的PHP代码的入口点。在深处,代码检查REQUEST_URI标头以查看它是否与您的多个站点(/dios)匹配,如果匹配,则将请求转发到配置的页面(dios.php)。

当我们为/dioses/agni执行.htaccess重定向时,我们可以点击index.php(通过删除[L]),但REQUEST_URI标头仍然保持不变(/ dioses / agni)并且它没有配置mulisite。因此,重定向失败。

答案 2 :(得分:1)

RewriteEngine On
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^www\.animals\.com/lion$ /www.animals.com/database/?animal=lion [R=301,NE,NC,L]

只需使用此代码即可。我希望它会奏效。

答案 3 :(得分:0)

通过调用add_filter('rewrite_rules_array', function() {})或调用add_rewrite_rule()都无法进行URL重写。显然那是因为打开前端网站页面时从未触发过过滤器'rewrite_rules_array',所以没有生成重写。

解决方案是转到管理区域,然后打开页面设置->永久链接。每当我想更改重写时,都需要这样做。

我不知道香草味的Wordpress是否可以那样工作,这可能是由已安装的插件/主题引起的。