通过 Wordpress Rewrite 或 .htaccess 重写 URL
Posted
技术标签:
【中文标题】通过 Wordpress Rewrite 或 .htaccess 重写 URL【英文标题】:URL rewriting via Wordpress Rewrite or .htaccess 【发布时间】:2013-05-15 21:36:01 【问题描述】:跳转到 EDIT8 看看我是如何解决这个问题的
假设我有一个 Wordpress 博客:www.animals.com
。我的主题目录中有一个特定的 php 文件:www.animals.com/wp-content/themes/mytheme/db.php
。另外,我有一个用于该页面的自定义模板,因此我在 Wordpress 管理面板中创建了一个新页面以显示 db.php
:www.animals.com/database
。
所以如果我想读一些关于狮子的东西,我就去:www.animals.com/database/?animal=lion
(因为这是我决定编写 PHP 的方式,将来自 $_GET['animal'] 的值插入到查询中,使用 PDO等等)。
现在,我想以www.animals.com/lion
的身份访问www.animals.com/database/?animal=lion
。
我应该使用 .htaccess 还是 Wordpress Rewrite?我应该将我的 .htaccess 放在 Wordpress 文件夹的根目录(带有 wp-config.php 和那些文件)还是我的主题目录中?
默认情况下,来自根的具有RewriteBase /
和来自 Wordpress 的东西。我应该写什么来实现我想要的?我应该把它放在现有代码之前还是之后?
编辑:这是我的 public_html .htaccess,这是我真正想要做的:
我有一个网站:www.domain.com
,当你输入这个http://www.domain.com/dios/?dios=agni
时,它会显示关于烈火神的信息。我想输入www.domain.com/dioses/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/
为(www.domain.com/wp-content/themes/smitespain/dioses.php)
domain.com/dios/?dios=thor
为(www.domain.com/wp-content/themes/smitespain/dios.php)
EDIT6:我正在阅读 wordpress codex 中的一些内容。我意识到,如果我想访问 domain.com/dioses
,我可以通过 domain.com/index.php?pagename=dioses
或 domain.com/?pagename=dioses
访问它
所以,我在Rewritebase /
和下一条规则之间添加了这个:RewriteRule example/test ?pagename=dioses
和domain.com/example/test
将我重定向到domain.com/dioses
,但它也更改了地址栏中的 url :(
问题是,如果我尝试这个:RewriteRule example/test ?pagename=dios&dios=thor
它会将我发送到没有 '?dios=thor' 的页面 'dios'
EDIT7:我开始使用 wordpress 重写,我将此添加到我的主题的 functions.php:
function my_rewrite_rules()
add_rewrite_rule(
'blah',
'index.php?pagename=dios&dios=agni',
'top'
);
add_action( 'init', 'my_rewrite_rules' );
再次..它加载页面 dios,没有 ?dios=agni
EDIT8:最后,我设法让它工作了 =)
我需要知道的第一件事是,新的?dios=XXXX
将不再对$_GET['dios']
可用,您需要调用$wp_query->query_vars['dios']
所以我将它添加到我的主题的functions.php 中
function add_query_vars($new_var)
$new_var[] = "dios";
return $new_var;
add_filter('query_vars', 'add_query_vars');
function add_rewrite_rules($rules)
$new_rules = array('([^/]+)' => 'index.php?pagename=dios&dios=$matches[1]');
$rules = $new_rules + $rules;
return $rules;
add_filter('rewrite_rules_array', 'add_rewrite_rules');
我确保$wp_query->query_vars['dios']
确实已设置
然后我只是添加常规规则
【问题讨论】:
+1 分享解决方案并详细说明。 谢谢老兄,你真的帮了我很多:D感谢你花时间在这个=)(我会给你+1,但我还有15个代表点xDDD) 【参考方案1】:还有另一种方法可以解决它,无需接触 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 对此的见解)
【讨论】:
【参考方案2】:WordPress 为所有未识别的内容(即不是现有文件或文件夹到其/index.php
)在根目录上设置了一个全局重定向。另一方面,您现在想将它们重定向到?animal=unidentified
。因此,除非动物关键字列表得到修复,否则提出的任何解决方案都可能会弄乱您的 WordPress。
如果您有 10 多种动物,您可以像下面这样将它们添加到您的 .htaccess(在根目录 /)中
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 中。你也可以让这两个规则共存,这样如果你还没有修改 .htaccess 为/panther
,你仍然可以在/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为其配置。因此,重定向失败。
【讨论】:
我设法在他们目录中的 .htaccess 文件中写了这个: RewriteRule ^(\w*)$ db.php?animal=$1 所以现在我可以访问 www.animals.com/wp -content/themes/mytheme/db.php?animal=lion as www.animals.com/wp-content/themes/mytheme/lion 那我可以用那个网址做点什么吗?喜欢从那个网址转到 www.animals.com/lion 吗?如果我想使用固定列表,我应该怎么做? 我说的是根“domain.com/lion”。如果“domain.com/someanimalyoudontwant”被 wordpress 重定向,现在不会发生。 感谢您的帮助,但我无法真正理解:S 哦,我明白了,是的,我想在地址栏中输入:animals.com/lion 以访问 animal.com/database/?animal=lion 所以如果我有一个“关于'页面,然后我输入animal.com/about 实际的'关于'页面和?animal = about之间会有冲突或类似的东西,对吧?我如何使用固定列表来做到这一点? 是的,这就是我想让你理解的。名单有多长?在一个点之后它可能变得不切实际。现在在我的咖啡休息时间.. :) 我会在一段时间内发布一个包含三到四只动物的样本。【参考方案3】:RewriteEngine On
RewriteCond %QUERY_STRING ^$
RewriteRule ^www\.animals\.com/lion$ /www.animals.com/database/?animal=lion [R=301,NE,NC,L]
只需使用此代码。我希望它会起作用。
【讨论】:
欢迎来到 Stack Overflow!请不要在您的帖子中使用签名或标语。您发布的每个帖子都已使用您的标准用户卡“签名”,该卡直接链接回您的用户页面。你的用户页面属于你——用你感兴趣的有趣信息、你做过的很酷的东西或任何你喜欢的东西来填充它!可能值得一看 help center,特别是 What kind of behavior is expected of users? 页面。【参考方案4】:URL 重写对我不起作用,无论是调用add_filter('rewrite_rules_array', function() )
还是调用add_rewrite_rule()
。显然这是因为在打开前端网站页面时从未触发过滤器'rewrite_rules_array'
,因此不会生成重写。
解决方案是转到管理区域,然后打开页面设置 -> 永久链接。每次我想改变我的重写时,我都需要这样做。
我不知道 vanilla Wordpress 是否这样工作,这可能是由安装的插件/主题引起的。
【讨论】:
以上是关于通过 Wordpress Rewrite 或 .htaccess 重写 URL的主要内容,如果未能解决你的问题,请参考以下文章
Wordpress add_rewrite_rule 页面重定向错误
iis wordpress 404错误 伪静态rewrite
Wordpress 显示启用了 Apache mod_rewrite 的目录列表