HTAccess-不带重定向的重写规则不起作用

时间:2021-07-23 作者:LS_

我必须创建3个页面模板来显示从Wordpress之外的不同webservices检索到的一些内容。

模板包括:

page-collections.php
page-collection.php
page-productDetail.php
我还创建了3个新页面并关联了模板。

collections --> page-collections.php
collection --> page-collection.php
product detail --> page-productDetail.php
由于内容来自外部webservices,我没有访问特定集合/产品的url。因此,为了获得“漂亮”的url,我正在尝试重写url:

https://www.website.com/collections/exampleName
在哪里exampleName 是用于从ws检索内容的集合的名称。

收件人:

https://www.website.com/collections/collection/?collectionName=exampleName
我将以下规则置于# BEGIN WordPress 指令:

<IfModule mod_rewrite.c>

# Turn mod_rewrite on
RewriteEngine On
RewriteRule ^(collections)/(.+)$ /collections/collection/?collectionName=$2 [L]

</IfModule>
但我得到的不是预期的页面,而是404错误。

如果我更换[L] 具有[R=301,L] 重写工作正常,但它强制301重定向,这不是我想要的。我只是需要重写一下。

你对为什么会发生这种情况有什么线索吗?

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

您可以添加重写规则以映射到其中一个页面,如下所示:

add_action( \'init\',  function() {
    add_rewrite_rule( \'myparamname/([a-z0-9-]+)[/]?$\', \'index.php?myparamname=$matches[1]\', \'top\' );
} );
的第一个参数add_rewrite_rule 是与URL匹配的正则表达式。第二个参数是index.php 非pretty permalink URL,URL参数直接映射到WP_Query 参数。

如果我们以你的第一页为例collections/collection/example:

add_action( \'init\',  function() {
    add_rewrite_rule( \'collections/collection/([a-z0-9-]+)[/]?$\', \'index.php?name=collection&collection_parameter=$matches[1]\', \'top\' );
} );
name=collection 告诉WordPress我们想要有slug的页面collection, 和collection_parameter 是我们传递最终零件值的方式。

然后我们需要允许使用collection_parameter, 并调整页面模板以使用它,而不是$_GET

要从页面模板中获取值,请执行以下操作:

$collection = get_query_var( \'collection_parameter\' );
要将参数列入白名单,我们需要将其添加到白名单中:

/**
 * Register custom query vars
 *
 * @param array $vars The array of available query variables
 * 
 * @link https://codex.wordpress.org/Plugin_API/Filter_Reference/query_vars
 */
function myplugin_register_query_vars( $vars ) {
    $vars[] = \'collection_parameter\';
    return $vars;
}
add_filter( \'query_vars\', \'myplugin_register_query_vars\' );
不要忘记刷新重写规则,您可以将其扩展到其他两个页面。

相关推荐

重新保存固定链接后,.htaccess重定向消失

我希望我的WordPress网站加载https+非www,并且没有斜杠。我输入了以下代码.htaccess 文件:<IfModule mod_rewrite.c> RewriteEngine On # Remove trailing slash from non-filepath urls RewriteCond %{REQUEST_URI} /(.+)/$ RewriteCond %{REQUEST_FILENAME} !-d Rewrite