通过WordPress Rewrite或.htaccess进行URL重写

16

JUMP TO EDIT8 TO SEE HOW I SOLVED THIS


假设我有一个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和那些文件),还是放在我的主题目录中?

根目录下的那个具有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

编辑2: 我正在使用多站点功能(请检查编辑4),而/database/ /dios/ 和 /dioses/ 不是我创建的实际文件夹,这只是我在WordPress中创建的页面名称。问题是现在它在选项卡标题中显示了神的名称 :S 这意味着变量 $_GET['dios'] 被设置了,但它没有加载文件(dios.php)= /

编辑3: 我需要访问特定的 domain.com/dios/?dios=agni,因为这是能够让 PHP 文件(dios.php) 调用 WordPress 的 get_header() 函数的URL,所以我无法直接访问该文件

编辑4: 我决定删除多站点功能

编辑5: 这些是我的 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)

编辑6: 我在 WordPress Codex 中阅读了一些内容,并意识到,如果我想访问 domain.com/dioses,我可以通过访问 domain.com/index.php?pagename=diosesdomain.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',但没有 '?dios=thor'

编辑7: 我开始使用 WordPress Rewrite,我将以下内容添加到我的主题的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参数

编辑8: 最终,我设法让它工作了 =)
我需要知道的第一件事是,新的?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']实际上已经设置好了
然后我只是添加了常规规则


3
感谢分享解决方案并提供详细说明,点赞! - Ravi K Thapliyal
谢谢,老兄。你实际上帮了我很多:D感谢你花时间做这个=)(我会给你+1的,但我只有15个声望点数xDDD) - johnRivs
4个回答

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将REDIRECT_URI设置为E=URI:value参数中指定的值。 indexw.php只需使用正确的值覆盖REQUEST_URI即可(感谢Ravi Thapliyal提供的见解)


1
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 中。您也可以同时存在这两个规则,以便如果您尚未修改 /panther 的 .htaccess,则仍可以在 /a/panther 访问它。

编辑:
好吧,我研究了一下,如果不编写 PHP 脚本来拦截此请求并转发它到 index.php,则无法实现。多站点的工作原理如下:由于没有匹配到你的任何重写,它会转到 index.php;这是WordPress PHP代码的入口点。在某个深处,代码检查 REQUEST_URI 标头是否与您的多站点之一相匹配(/dios),如果匹配,则将请求转发到配置的页面(dios.php)。

当我们对/dioses/agni进行.htaccess重定向时,我们可以通过删除[L]来访问index.php,但是REQUEST_URI头仍然保持不变(/dioses/agni),并且没有为其配置多站点。因此,重定向失败。

我在谈论根目录“domain.com/lion”。如果WordPress很好地重定向了“domain.com/someanimalyoudontwant”,现在就不会发生这种情况。 - Ravi K Thapliyal
我很感激你的帮助,但是我真的无法理解 :S - johnRivs
嗯...现在我想写36种动物,并且每两周添加一个新的xD 谢谢=) - johnRivs
我真的需要将它们分组为一个“文件夹”。请检查我所做的更新.. 非常感谢你的耐心 :) - johnRivs
显示剩余21条评论

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

只需使用这段代码。希望它能够运行。

1
欢迎来到 Stack Overflow!请不要在您的帖子中使用签名或标语。您发布的每篇帖子已经用您的标准用户卡“签名”,该卡直接链接回您的用户页面。您的用户页面属于您 - 请填写有关您兴趣、您所从事的酷炫工作或其他任何您喜欢的有趣信息!也许值得一看 帮助中心,特别是 用户应遵守哪些行为规范? 页面。 - Xavi López

0

URL 重写对我不起作用,无论是通过调用 add_filter('rewrite_rules_array', function() {}) 还是通过调用 add_rewrite_rule()。显然,这是因为在打开前端网站页面时从未触发过过滤器 'rewrite_rules_array',因此重写未生成。

解决方案是进入管理区域,只需打开页面设置 -> 永久链接。每次想要更改我的重写时,我都需要这样做。

我不知道原始的 WordPress 是否像这样工作,这可能是由于我安装的插件/主题引起的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接