【问题标题】:Adding mod_rewrite Rules to .htaccess in WordPress在 WordPress 中将 mod_rewrite 规则添加到 .htaccess
【发布时间】:2012-10-08 07:26:23
【问题描述】:

我正在尝试修改 WordPress 中的 mod 重写规则,而不直接修改 .htaccess 文件。根据这个网页似乎可以:Adding mod_rewrite Rules to .htaccess in WordPress。我按照说明创建了一个插件,如下所示。我将文件名保存为 sample-mod-rewrite.php

/* Plugin Name: Sample Mod Rewrite  */

add_action('generate_rewrite_rules', array(&$this, 'generate_rewrite_rules'));
add_filter('mod_rewrite_rules', array(&$this, 'mod_rewrite_rules'));
function generate_rewrite_rules() {
    global $wp_rewrite;
    $non_wp_rules = array(
        'simple-redirect/?$plugin_name' => 'http://google.com',
        'one-more-redirect/?$plugin_name' => 'http://yahoo.com'
    );

    $wp_rewrite->non_wp_rules = $non_wp_rules + $wp_rewrite->non_wp_rules;
}
function mod_rewrite_rules($rules) {
    $rules = preg_replace('/^(RewriteRule ^.*+/?$)plugin_name (/)(.*) ([QSA,L])$/im', '1 3 [R=301,L]', $rules);
    return $rules;
}

它应该如何工作?激活插件后,当我访问 http://siteurl/simple-redirect/?sample-mod-rewritehttp://siteurl/simple-redirect/?sample-mod- rewrite.php 浏览器只显示 404 错误,“找不到对象!”。我想我一定做错了什么。

array(&$this, 'generate_rewrite_rules') 部分看起来像是传递了一个类方法,但网页并没有说明任何有关创建类的信息。这应该很简单。

谢谢。

【问题讨论】:

    标签: php mod-rewrite wordpress


    【解决方案1】:

    由于你的插件不使用类,你应该使用:

    add_action('generate_rewrite_rules', 'generate_rewrite_rules');
    add_filter('mod_rewrite_rules', 'mod_rewrite_rules');
    

    mod_rewrite_rules 中使用的正则表达式并不完全正确,但我不能给你一个更好的,因为我不知道你真正想要实现什么。

    别忘了重新生成您的 .htaccess 文件。

    编辑

    要重新生成您的 .htaccess 文件,您只需访问您的永久链接设置。

    函数generate_rewrite_rules会在.htaccess中添加以下规则:

    RewriteRule ^simple-redirect/?$plugin_name /wordpress/http://google.com [QSA,L]
    RewriteRule ^one-more-redirect/?$plugin_name /wordpress/http://yahoo.com [QSA,L]
    

    mod_rewrite_rules函数的目标就是纠正这些规则,你可以试试:

    $rules = preg_replace('#^(RewriteRule \^.*/\?\$)plugin_name .*(http://.*) \[QSA,L\]#mi', '$1 $2 [R=301,L]', $rules);
    

    那么规则将是:

    RewriteRule ^simple-redirect/?$ http://google.com [R=301,L]
    RewriteRule ^one-more-redirect/?$ http://yahoo.com [R=301,L]
    

    所以访问siteurl/simple-redirect/ 将重定向到google.com ...

    【讨论】:

    • 感谢您更正参数。 I can't give you a better one since I don't know what you really want to achieve. - 好的,我尽量说清楚。我正在尝试查看 mod 重写规则在 WordPress 中是如何工作的,所以我需要一个工作示例来通过分解代码来分析代码。当我们说 siteurl/simple-redirect/?sample-mod-rewrite=true 被访问时,我发布的示例插件应该将页面重定向到谷歌或雅虎。关于重新生成.htaccess 文件,我该怎么做?只需在永久链接设置页面中保存选项即可完成?
    • 感谢您的跟进。 To regenerate your .htaccess file, you simply have to access your permalinks settings. - 所以如果我想在分布式插件中实现它,由于用户必须手动保存永久链接设置,这不切实际吗?此外,如果永久链接设置为默认值,它似乎不会将规则添加到.htaccess。顺便说一句,我想知道正则表达式模式中的$plugin_name 是干什么用的。
    • 关于.htaccess代,你应该再问一个问题。关于$plugin_name,你应该仔细阅读你找到的教程:“我在每条规则中都使用了字符串'plugin_name',只是为了确保我不会进一步编辑其他人的重写规则”跨度>
    • "I used the string ‘plugin_name’ in every rule just to make sure that I don’t edit anyone else’s rewrite rules further on" - 虽然它看起来像一个 PHP 变量。那么$ 符号在这里与 PHP 无关,而只是用于将其与其他查询字符串区分开来?
    • 不是来自其他查询字符串,来自其他规则。而$plugin_name 不是变量,因为它位于一个简单的引号字符串中。
    【解决方案2】:

    我正在发布工作的完整代码。我把它包装在一个类中。

    /* Plugin Name: Sample Mod Rewrite  */
    
    add_action('generate_rewrite_rules', array(new custom_mod_rewrite, "generate_rewrite_rules"));
    
    class custom_mod_rewrite {
        function __construct() {
            $this->wp_rewrite = & $GLOBALS["wp_rewrite"];
        }
        function generate_rewrite_rules() {
    
            $non_wp_rules = array(
                'simple-redirect/?$plugin_name' => 'http://google.com',
                'one-more-redirect/?$plugin_name' => 'http://yahoo.com'
            );
    
            $this->wp_rewrite->non_wp_rules = $non_wp_rules + $this->wp_rewrite->non_wp_rules;
            add_filter('mod_rewrite_rules', array(&$this, "mod_rewrite_rules"));
        }
        function mod_rewrite_rules($rules) {
            return preg_replace('#^(RewriteRule \^.*/)\?\$plugin_name .*(http://.*) \[QSA,L\]#mi', '$1 $2 [R=301,L]', $rules);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 2012-04-22
      相关资源
      最近更新 更多