.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');
正確に私のためにうまくいった..
この問題は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);
RewriteRule ^ /%1.xml [L]
これはinternal rewriteではなく、external redirect)である必要があります(そうしないと、表示されるURLは変更されないので、何もしていないように見えます)。したがって、R
redirect
例::flag
RewriteRule ^ /%1.xml [R,L]
これは一時的な(302)リダイレクトです。 R
をR=301
に変更して恒久的な(301)リダイレクトにします - ただし、問題がないことが確実な場合に限ります。 (301秒以降はブラウザによってハードキャッシュされ、テストが問題になる可能性があります。)
ただし、RewriteCond
ディレクティブは必要ありません。これは単一のRewriteRule
で行うことができます(そうする方がより効率的です)。また、これは_(beforeあなたの既存の内部的な書き換えそして理想的にはbefore# BEGIN WordPress
ブロック)でなければなりません。そうでなければあなたのカスタマイズは将来の更新で上書きされるかもしれません。
だから、あなたが必要とするのは(あなたのファイルの一番上に)ことだけです:
RewriteRule ^(.+)\.xml/$ /$1.xml [R,L]
あなたの正規表現中のリテラルドットをエスケープすることを忘れないでください。
UPDATE: そしてはい、それは$1
最後にマッチした_(CondPattern)への後方参照ではなくRewriteRule
pattern)への後方参照として)%1
であるべきです。
サイトマップを出力しているのであれば、ページのクエリを待つ理由はありません。これがリダイレクトの原因です。
以前のアクションをフックすれば、最後のスラッシュに対抗するために必要なものは何もありません。
_編集_
これは、クエリ変数、ルール、および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' );