【问题标题】:Wordpress pages address rewriteWordpress 页面地址重写
【发布时间】:2011-01-27 04:16:38
【问题描述】:

更新

我尝试使用内部 wordpress 重写。我要做的是这样的地址:

http://example.com/galleria/artist-name

使用包含artist-name 的变量发送到gallery.php 页面。

我根据 Wordpress 的文档使用了这些规则:

// REWRITE RULES (per gallery) {{{
add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('init','flushRules');

// Remember to flush_rules() when adding rules
function flushRules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// Adding a new rule
function wp_insertMyRewriteRules($rules)
{
    $newrules = array();
    $newrules['(galleria)/(.*)$'] = 'index.php?pagename=gallery&galleryname=$matches[2]';
    return $newrules + $rules;
}

// Adding the id var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars)
{
    array_push($vars, 'galleryname');
    return $vars;
}

现在奇怪的是,在我的本地 wordpress 测试安装中,它运行良好:调用库页面并传递了 galleryname 变量。另一方面,在真实站点上,初始 URL 被接受(因为它没有进入 404)但它更改为 http://example.com/gallery(我的意思是它实际上在浏览器的地址栏中发生了变化)并且变量是未在 gallery.php 中定义。

知道什么可能导致这种不同的行为吗?

或者,我想不出的任何其他方法可以达到前三行中描述的相同效果。


老问题

我需要做的是重写这个地址:

(1) http://localhost/wordpress/fake/text-value

(2) http://localhost/wordpress/gallery?somevar=text-value

注意事项:

  • 重映射必须是透明的:用户总是必须看到地址(1)
  • gallery 是 wordpress 页面的永久链接,而不是真实地址

我基本上需要先重写地址(修改它),然后再反馈给mod rewrite(让wordpress自己解析)。

问题

如果我只是这样做

RewriteRule ^fake$ http://localhost/wordpress/gallery [L]

它可以工作,但是浏览器中的地址发生了变化,如果我这样做了,那就不好了

RewriteRule ^fake$ /wordpress/gallery [L]

我得到一个 404。我尝试了不同的标志而不是 [L],但无济于事。我怎样才能让它工作?

编辑:完整的.htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On

RewriteRule ^fake$ /wordpress/gallery [R]

RewriteBase /wordpress/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

# END WordPress

【问题讨论】:

  • [L] 表示“最后一个”,因此在第一个规则之后您不会得到任何其他规则。第一个不作为“最后一个”的原因是因为包含主机名会强制请求返回到浏览器。请记住,重写规则是按顺序应用的,并且只对规则进行一次传递,因此如果您的 /wordpress/gallery URL 需要重写,请将规则放在上面显示的 RewriteRule 之后。跨度>
  • (如果没有看到 RewriteRules 的完整列表,我无法提供“真实”的答案。)
  • 添加了完整的规则列表
  • 我认为您不能在 .htaccess 文件中执行此操作,因为 Wordpress 使用原始 URL(即“/wordpress/fake/text-value”)来确定如何处理请求。我认为您可能需要将自己的规则添加到 Wordpress 的内部重写系统中,请参阅:codex.wordpress.org/Function_Reference/WP_Rewrite
  • Richard:是的,我试过了,它适用于我的本地安装,但由于某种原因,我正在处理的网站的工作方式不同(它塞满了各种插件)所以我一直在寻找一个重写的解决方案,而不是处理那个烂摊子

标签: wordpress mod-rewrite url-rewriting


【解决方案1】:

试试这个规则:

RewriteRule ^fake/([^/]+)$ gallery?somevar=$1 [L]

【讨论】:

  • 不,这是我尝试的第一件事,它只是以来自 wordpress 的 404 结尾。
【解决方案2】:

很抱歉这里的答案非常延迟,但我相信你需要做的是 Gumbo 建议的,但 the addition of the passthrough/PT flag:

此标志强制重写引擎将内部 request_rec 结构的 uri 字段设置为文件名字段的值。
...
如果你想混合来自不同模块的指令,允许 URL 到文件名的翻译,你必须使用这个标志。

虽然 Wordpress(通过 mod_php)在 mod_rewrite 完成后运行,但它通常会获取原始(预重写)uri,并使用它来进行自己的内部重写,而不是重写的文件名值。

那就试试吧:

RewriteRule ^fake/([^/]+)$ gallery?somevar=$1 [QSA,PT]

我添加了 QSA,以防万一有人访问 /wordpress/fake/something?page=3,它会正确传递。让我知道它是如何工作的。

【讨论】:

  • 我也试过 PT,但没有帮助。我相信唯一的方法是通过 wordpress 的内部重写,正如 Richard M 在评论中所说的那样。
【解决方案3】:

已解决,需要将 Permalink Redirect 插件配置为跳过所需的“虚拟”网址,否则会发出 301 永久移动。

【讨论】:

    【解决方案4】:
    1. 使用您喜欢的 HTML/PHP 编辑器,打开wp-admin/includes/misc.php

    2. 找到函数functiongot_mod_rewrite在第18行左右。

    3. 注释掉现有函数:/* this is commented out */ — 如果您确定解决方案有效,您可以删除此函数,但为了安全起见,只需将其注释掉,以备不时之需。

    4. 改为添加以下内容:

      function got_mod_rewrite() {
          $got_rewrite = true;
          return apply_filters(‘got_rewrite’, $got_rewrite);
      }
      
    5. 保存并上传。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-17
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多