【问题标题】:.htaccess rewriterule not working (wordpress).htaccess rewriterule 不工作(wordpress)
【发布时间】:2019-03-17 04:45:15
【问题描述】:

我在这里迫切需要一些帮助。关于这个问题,我已经把头发拉了一个多星期了。我知道它应该非常简单,但由于某种原因它不起作用......

我有一个搜索查询,出于美学和 seo 的原因,我想让它看起来很漂亮。我希望 /rentals 在内部重定向到(丑陋的)查询 /?ct_ct_status=for-rent&search-listings=true。在这里澄清一下,我希望访问者不要注意到当他们访问 /rentals 时,他们实际上被重定向到查询。

无论如何,我已经尝试了以下方法:

RewriteEngine On
RewriteBase /
RewriteRule ^rentals/?$ https://www.example.com/?ct_ct_status=for-rent&search-listings=true [L]

现在这里的 example.com 显然不是实际的 url。我已经尝试了上述方法以及它的许多细微变化,包括:只有查询而不是完整的 url;不同的旗帜;有和没有 RewriteEngine On;有和没有 RewriteBase;尝试不重定向到查询,而是重定向到常规页面;可能还有一些我忘记的其他事情。

现在还值得一提的是,这个网站是在 Wordpress 上运行的。上面的 rewriterule 放在 .htaccess 中 Wordpress 部分的上方,但这也不起作用。

如果您希望我提供更多信息,请告诉我!

感谢您的帮助!

编辑: 要回答@msg 问题: 我应该在我最初的问题中提到这一点。上面提到的 RewriteRule 会重定向到正确的页面。但是,它是外部重写。换句话说,当访问 /rentals 时,它会重定向到 https://www.example.com/?ct_ct_status=for-rent&search-listings=true,但它会将重定向显示为 url,因此不会将 /rentals 显示为 url。目标是使其成为内部重写,以便当有人访问 /rentals 时,它实际上将 /rentals 显示为 url,而不是重定向。

我还尝试了 [R] 标志,Apache 的网站说这是用于内部重写的正确标志:link。但这仍然会导致外部重写。

Wordpress 不处理查询。处理主页的 PHP 文件检查是否存在搜索查询,如果存在,则显示处理搜索结果的 PHP 文件的输出。

回答@shane 的问题: 我对上述@msg 问题之一的回答也可能有助于回答您的问题。但进一步扩展,租金实际上不是自定义帖子类型。它是一种名为“列表”的自定义帖子类型的分类。

function add_custom_rewrite_rule() {
    add_rewrite_rule('^rentals/?$', 'https://www.redcapper.com/?ct_ct_status=for-rent&search-listings=true', 'top');
}

add_action('init', 'add_custom_rewrite_rule', 10, 0);

我已尝试使用上述方法连接到 Wordpress 的重写 API,但它不起作用...它给了我一个 404 错误...

【问题讨论】:

  • 问题。有什么问题?什么都不做?网址有变化吗? 404 ?查询是由 wordpress 自己处理的?
  • Marnix.hoh 你能提供更多关于如何创建和搜索自定义帖子类型的信息吗?我会根据您的回复修改我的回答。
  • 非常感谢您的帮助!这对我来说真的意味着世界! @shane 我已经对我的问题进行了编辑,我在其中回答了您的问题。如果您还希望我提供更多信息,请再次告诉我。
  • @msg 我还在我的编辑中添加了对您问题的答案。非常感谢你的帮助!!如果您希望我进一步扩展一些内容,请告诉我
  • @Marnix.hoh 我已经更新了我的答案 - 试一试,让我知道

标签: wordpress .htaccess mod-rewrite


【解决方案1】:

不应在 .htaccess 中重写 WordPress URL - WordPress 本身实现了它自己的重写引擎。

所有重写都应使用此 API 完成。见add_rewrite_rule

编辑
试试这个...

function add_custom_rewrite_rule() {
    add_rewrite_rule('^rentals/?$', 'index.php?ct_ct_status=for-rent&search-listings=true', 'top');
}

add_action('init', 'add_custom_rewrite_rule', 10, 0);

【讨论】:

  • 感谢您的建议。不幸的是,这也不起作用,它将我重定向到主页。请查看我的 cmets 到 @ msg,他们可能有助于了解正在发生的事情,更重要的是,我的主页如何检测和处理(搜索)查询。你会从我的 cmets 看到搜索查询不是由 wordpress 直接处理的,因此我的猜测是 wordpress 无法识别它,因此默认为主页。请让我知道您的想法,并知道我非常感谢您的帮助,谢谢!
  • 我会说你是对的。将 if (!empty($_GET['search-listings'])) 更改为 if (get_query_var('search-listings')) 并确保搜索列表模板也使用 get_query_var。
  • 还让搜索列表模板使用 get_query_var 到底是什么意思?你的意思是每次使用$_GET都要换成get_query_var?更改您的建议并使用 add_rewrite_tag 添加标签会将我重定向到 Wordpress 搜索结果页面。无论如何,是否可以只使用 .htaccess 进行重写?我的意思是它有点工作,只是“丑陋”查询显示在 url 栏中而不是 /rentals。再次感谢您的帮助
  • 嗨,Marnix,是的,这就是我的意思。如果您使用 $_GET 而不是 get_query_var,那么重写的 get 参数将不起作用。有很多原因不在 .htaccess 中进行重写 - 例如,您可能有一个安全插件会覆盖您的重写规则。 Wordpress 内置了这个功能,现在需要做的就是更新你的模板,然后它就应该可以工作了——你现在就在家里了!
  • 非常感谢您的回复。我将来可能会尝试这样做。问题是,处理变量以准备(数据库/wordpress)查询的方式非常复杂(不是我写的)......所以我需要坐下来确保它不会影响代码的整体工作。我希望只编辑 .htaccess 文件就可以了。但我想它没有......再次,非常感谢您的帮助!
【解决方案2】:

抱歉,您不能这样做(据我所知)。外部重定向正是:重定向。屏蔽仅适用于内部重定向。根据documentation

如果指定了绝对 URL,mod_rewrite 会检查是否 主机名匹配当前主机。 [...] 否则,将对给定 URL 执行外部重定向

所以,无论你是否指定[R]标志,如果目标域不一样,它总是会导致浏览器栏上的URL发生变化。

您可以通过以下方式重定向到新域:

# [R] not necessary, being implied by the external redirect
RewriteRule ^(rentals)/?$ http://example.com/$1 [R,L]

这将导致重定向,但浏览器栏将显示http://example.com/rentals 而不是查询字符串一。在目标系统中,您已经有一个 wordpress rewrite_rule,所以它应该可以工作。

这是你目前拥有的和你想要的之间的妥协。

您真正想做的是 proxy 一个请求,而 mod_rewrite 本身无法做到这一点。这并不像您想象的那么简单,有许多安全考虑,客户端可能不信任目标系统,或者涉及会话 cookie 或其他潜在的信息泄露。

但是,如果中间立场不可接受,您可以查看mod_proxy。支持使用mod_rewrite[P] flag 代理请求,但您有这个先决条件。但这是我没有使用过的设置,也帮不上什么忙。

如果您可以修改代码,您可以考虑废弃目标页面,但这看起来工作量太大。

最后,您可以将目标页面嵌入到当前页面中。

【讨论】:

  • 非常感谢您快速而深入的回复@msg。但是,我没有重定向到另一个域。目标域是相同的。换句话说,有人会去example.com/rentals 并且应该被重定向到example.com/?ct_ct_status=for-rent&search-listings=true。所以域是相同的,因此内部重写应该是可能的,不是吗?
  • @Marnix.hoh 那么这不是mod_rewrite 问题,看起来严格像wordpress 问题,但是由于您说查询不是由wp 处理的,所以我对您的内容有点迷茫设置是。您的“主页检查”脚本在哪里?如果它确实由 wordpress 处理,您应该能够使用股票 RewriteRuleadd_rewrite_rule 来处理它,尝试将您的目标更改为 'index.php?ct_ct_status=for-rent&search-listings=true' 并在 Settings > Permalinks > Save 中刷新您的规则。
  • 不幸的是,这不起作用...它只是将我重定向到主页。有一个“创建”主页的 php 文件。在该 php 文件的顶部是代码检查“search-listings”是否是一个设置的 GET 变量。如果是这样,它会重定向到“搜索页面”。那有意义吗?如果您想让我详细说明,请告诉我。再次感谢您的帮助
  • 是的,请。使用 WordPress 默认 RewriteRules,对不存在文件的任何请求都会转到 Wordpress 的 index.php。所以/?ct_ct... 将被重定向到index.php?ct_ct... 但你说主页脚本不是wordpress 页面。你修改了index.php 吗?这个“检查器”脚本有什么作用?
  • 主页使用“模板”,因此作为主页的 Wordpress 页面分配有模板“主页”。换句话说,主模板 php 文件在文件顶部有以下注释:/** * Template Name: Home */ 在同一文件中此注释的正下方是以下代码:if (!empty($_GET['search-listings'])) { get_template_part('search-listings'); return; } 这会检查是否有搜索查询,或者更确切地说,它检查“search-listings”是否是查询中设置的 GET 变量之一。如果是这样,它会加载搜索结果页面
猜你喜欢
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多