web-dev-qa-db-ja.com

htaccess:URLの末尾のスラッシュを.xml /のみで削除する

.xml/のみで終わるURLから末尾のスラッシュを削除する必要があります。この目的のために、私はテストリンクに対して完全にうまく機能するRewrite Condition and Ruleを作成しました http://website.com/test.xml/)

テストリンク: http://htaccess.mwl.be?share=6fe08232-438a-53fa-8f1a-1f7f69b77b6f

問題は、WordPressの.htaccessファイルにルールを配置したときに、まったく機能しないことです。 WordPressやYOASTのようなパーマリンク構造がルールをオーバーライドしています..助けてください!

# 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

注意:

これは物理的なファイルではありません。実行時に書き換え規則を使用してサイトマップを生成することに注意してください。これは実際にはワードプレスのページです!

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

1
Hassan Alvi

正確に私のためにうまくいった..

この問題はWordPressの正規のリダイレクトによるものです。パーマリンク構造で/%postname%/を使用すると、カスタムテンプレートが末尾のスラッシュ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);

0
Hassan Alvi
RewriteRule ^ /%1.xml [L]

これはinternal rewriteではなく、external redirect)である必要があります(そうしないと、表示されるURLは変更されないので、何もしていないように見えます)。したがって、Rredirect例::flag

 RewriteRule ^ /%1.xml [R,L]

これは一時的な(302)リダイレクトです。 RR=301に変更して恒久的な(301)リダイレクトにします - ただし、問題がないことが確実な場合に限ります。 (301秒以降はブラウザによってハードキャッシュされ、テストが問題になる可能性があります。)

ただし、RewriteCondディレクティブは必要ありません。これは単一のRewriteRuleで行うことができます(そうする方がより効率的です)。また、これは_(beforeあなたの既存の内部的な書き換えそして理想的にはbefore# BEGIN WordPressブロック)でなければなりません。そうでなければあなたのカスタマイズは将来の更新で上書きされるかもしれません。

だから、あなたが必要とするのは(あなたのファイルの一番上に)ことだけです:

RewriteRule ^(.+)\.xml/$ /$1.xml [R,L]

あなたの正規表現中のリテラルドットをエスケープすることを忘れないでください。

UPDATE: そしてはい、それは$1最後にマッチした_(CondPattern)への後方参照ではなくRewriteRulepattern)への後方参照として)%1であるべきです。

1
MrWhite

サイトマップを出力しているのであれば、ページのクエリを待つ理由はありません。これがリダイレクトの原因です。

以前のアクションをフックすれば、最後のスラッシュに対抗するために必要なものは何もありません。

_編集_

これは、クエリ変数、ルール、および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' );
1
Milo