HTAccess:仅从以.xml/结尾的URL中删除尾部斜杠

时间:2017-12-27 作者:Hassan Alvi

我需要从以结尾的URL中删除尾部斜杠.xml/ 只有为此,我创建了一个重写条件和规则,该条件和规则对于测试链接非常有效http://website.com/test.xml/

测试链接:http://htaccess.mwl.be?share=6fe08232-438a-53fa-8f1a-1f7f69b77b6f

问题是当我把规则放在WordPress中时.htaccess 文件,根本不起作用!似乎WordPress或YOAST Permalink结构正在覆盖规则。。请帮忙!

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_URI} /(.*).xml/$
RewriteRule ^ /%1.xml [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
注:

请注意,这不是物理文件。。使用重写规则在运行中生成站点地图!这实际上是一个wordpress页面!

add_rewrite_rule(\'([^/]*)-placeholder.xml\',\'index.php?page_id=123&custom‌​-slug=$matches[1]\',\'‌​top\');

3 个回复
最合适的回答,由SO网友:Hassan Alvi 整理而成

到底是什么对我起了作用。。

问题是由于WordPress规范重定向造成的。。使用/%postname%/ 在permalink结构中,将自定义模板重定向到尾部斜杠URL。

我只是删除了template_redirect 筛选规范重定向。。现在,链接在两种情况下都可以工作,即使用或不使用尾部斜杠。

这是我的代码供参考。。1234是用于生成动态站点地图的模板的示例页面id。

//Disabling canonical redirects for sitemap function disable_sitemap_redirect() { global $wp; $current_url = home_url(add_query_arg(array(),$wp->request)); $current_url = $current_url . $_SERVER[\'REDIRECT_URL\']; $id = url_to_postid($current_url); if($id == 1234) : remove_filter(\'template_redirect\', \'redirect_canonical\'); endif; } add_action(\'init\', \'disable_sitemap_redirect\', 10, 0);

SO网友:Milo

如果您正在输出一个站点地图,那么没有理由等待页面的查询-这就是产生重定向的原因。

钩住一个更早的动作,就不需要任何东西来反斜杠,因为它不会发生-

EDIT

下面是注册查询变量、规则和parse_request 措施:

// add the custom query vars
// WordPress will not parse query vars in rules
// if they are not added to the list of valid query vars
function wpd_sitemap_query_var( $vars ){
    $vars[] = \'svc-slug\';
    $vars[] = \'svc-offset\';
    return $vars;
}
add_filter( \'query_vars\', \'wpd_sitemap_query_var\' );

// add the rules
function wpd_sitemap_rewrite_rules() {
    add_rewrite_rule(
        \'([^/]*)-svc-([0-9]+).xml\',
        \'index.php?page_id=\'.get_field(\'dynamic_sitemap\',\'option\').\'&svc-slug=$matches[1]&svc-offset=$matches[2]\',
        \'top\'
    );
    add_rewrite_rule(
        \'([^/]*)-svc.xml\',
        \'index.php?page_id=\'.get_field(\'dynamic_sitemap\',\'option\').\'&svc-slug=$matches[1]\',
        \'top\'
    );
}
add_action(\'init\', \'wpd_sitemap_rewrite_rules\', 10, 0);

// intercept the query and test if our query var is set
// this means one of our rules matched and we should show the sitemap
function wpd_sitemap_parse_request( $query ){
    if( isset( $query->query_vars[\'svc-slug\'] ) ){
        echo \'<pre>\';
        print_r( $query->query_vars );
        echo \'</pre>\';

        // halt further execution after sitemap is output
        die;
    }
}
add_action( \'parse_request\', \'wpd_sitemap_parse_request\' );

SO网友:MrWhite

RewriteRule ^ /%1.xml [L]
这应该是外部重定向,而不是内部重写。(否则它看起来不会做任何事情,因为可见URL不会改变。)所以,你需要R (redirect) 旗帜例如:

 RewriteRule ^ /%1.xml [R,L]
这是一个临时(302)重定向。改变RR=301 使其成为永久(301)重定向-但仅当您确定其工作正常时。(因为浏览器会硬缓存301s,这可能会导致测试出现问题。)

但是,您不需要RewriteCond 指令。这可以在一个RewriteRule (这样做也会更有效率)。这也应该在您现有的内部重写之前进行,最好在# BEGIN WordPress 块,否则您的自定义可能会在将来的更新中被覆盖。

因此,您只需要(在文件的顶部):

RewriteRule ^(.+)\\.xml/$ /$1.xml [R,L]
记住在正则表达式中避开文字点。

UPDATE: 是的,应该是这样$1 (作为对RewriteRule 模式(与%1 (对上次匹配的CondPattern的反向引用)。

结束

相关推荐

阻止WordPress和插件覆盖.htaccess

如何防止WordPress和插件覆盖.htaccess 文件我使用Wordpress设置永久链接的结构;因此,我怀疑拒绝该文件的所有权限是否切实可行。如果WordPress不太可能负责覆盖文件,那么关于确定责任的建议将很有帮助。我最近将这些规则添加到。htaccess将流量重定向到HTTPS。 RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 一天后,

HTAccess:仅从以.xml/结尾的URL中删除尾部斜杠 - 小码农CODE - 行之有效找到问题解决它

HTAccess:仅从以.xml/结尾的URL中删除尾部斜杠

时间:2017-12-27 作者:Hassan Alvi

我需要从以结尾的URL中删除尾部斜杠.xml/ 只有为此,我创建了一个重写条件和规则,该条件和规则对于测试链接非常有效http://website.com/test.xml/

测试链接:http://htaccess.mwl.be?share=6fe08232-438a-53fa-8f1a-1f7f69b77b6f

问题是当我把规则放在WordPress中时.htaccess 文件,根本不起作用!似乎WordPress或YOAST Permalink结构正在覆盖规则。。请帮忙!

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_URI} /(.*).xml/$
RewriteRule ^ /%1.xml [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
注:

请注意,这不是物理文件。。使用重写规则在运行中生成站点地图!这实际上是一个wordpress页面!

add_rewrite_rule(\'([^/]*)-placeholder.xml\',\'index.php?page_id=123&custom‌​-slug=$matches[1]\',\'‌​top\');

3 个回复
最合适的回答,由SO网友:Hassan Alvi 整理而成

到底是什么对我起了作用。。

问题是由于WordPress规范重定向造成的。。使用/%postname%/ 在permalink结构中,将自定义模板重定向到尾部斜杠URL。

我只是删除了template_redirect 筛选规范重定向。。现在,链接在两种情况下都可以工作,即使用或不使用尾部斜杠。

这是我的代码供参考。。1234是用于生成动态站点地图的模板的示例页面id。

//Disabling canonical redirects for sitemap function disable_sitemap_redirect() { global $wp; $current_url = home_url(add_query_arg(array(),$wp->request)); $current_url = $current_url . $_SERVER[\'REDIRECT_URL\']; $id = url_to_postid($current_url); if($id == 1234) : remove_filter(\'template_redirect\', \'redirect_canonical\'); endif; } add_action(\'init\', \'disable_sitemap_redirect\', 10, 0);

SO网友:Milo

如果您正在输出一个站点地图,那么没有理由等待页面的查询-这就是产生重定向的原因。

钩住一个更早的动作,就不需要任何东西来反斜杠,因为它不会发生-

EDIT

下面是注册查询变量、规则和parse_request 措施:

// add the custom query vars
// WordPress will not parse query vars in rules
// if they are not added to the list of valid query vars
function wpd_sitemap_query_var( $vars ){
    $vars[] = \'svc-slug\';
    $vars[] = \'svc-offset\';
    return $vars;
}
add_filter( \'query_vars\', \'wpd_sitemap_query_var\' );

// add the rules
function wpd_sitemap_rewrite_rules() {
    add_rewrite_rule(
        \'([^/]*)-svc-([0-9]+).xml\',
        \'index.php?page_id=\'.get_field(\'dynamic_sitemap\',\'option\').\'&svc-slug=$matches[1]&svc-offset=$matches[2]\',
        \'top\'
    );
    add_rewrite_rule(
        \'([^/]*)-svc.xml\',
        \'index.php?page_id=\'.get_field(\'dynamic_sitemap\',\'option\').\'&svc-slug=$matches[1]\',
        \'top\'
    );
}
add_action(\'init\', \'wpd_sitemap_rewrite_rules\', 10, 0);

// intercept the query and test if our query var is set
// this means one of our rules matched and we should show the sitemap
function wpd_sitemap_parse_request( $query ){
    if( isset( $query->query_vars[\'svc-slug\'] ) ){
        echo \'<pre>\';
        print_r( $query->query_vars );
        echo \'</pre>\';

        // halt further execution after sitemap is output
        die;
    }
}
add_action( \'parse_request\', \'wpd_sitemap_parse_request\' );

SO网友:MrWhite

RewriteRule ^ /%1.xml [L]
这应该是外部重定向,而不是内部重写。(否则它看起来不会做任何事情,因为可见URL不会改变。)所以,你需要R (redirect) 旗帜例如:

 RewriteRule ^ /%1.xml [R,L]
这是一个临时(302)重定向。改变RR=301 使其成为永久(301)重定向-但仅当您确定其工作正常时。(因为浏览器会硬缓存301s,这可能会导致测试出现问题。)

但是,您不需要RewriteCond 指令。这可以在一个RewriteRule (这样做也会更有效率)。这也应该在您现有的内部重写之前进行,最好在# BEGIN WordPress 块,否则您的自定义可能会在将来的更新中被覆盖。

因此,您只需要(在文件的顶部):

RewriteRule ^(.+)\\.xml/$ /$1.xml [R,L]
记住在正则表达式中避开文字点。

UPDATE: 是的,应该是这样$1 (作为对RewriteRule 模式(与%1 (对上次匹配的CondPattern的反向引用)。

相关推荐

如何在我的根域上组合WordPress htaccess+在子文件夹上组合php

我为一个看似重复的问题道歉,但我所看到的几十个问题中,没有一个是同样的问题。我有以下目录结构:/.htaccess /index.php /subfolder/.htaccess /subfolder/index.php 我希望所有页面请求都由/index.php, 除非请求启动/subfolder 在这种情况下,应由/subfolder/index.php.e、 g。/abc 将重写为/subfolder/abce、 g。/subfolder/def 将重写为/subf