it-swarm.com.de

htaccess: Entfernen Sie den abschließenden Schrägstrich von der URL, die mit .xml/only endet

Ich muss abschließende Schrägstriche von URLs entfernen, die nur mit .xml/ enden. Zu diesem Zweck habe ich eine Umschreibebedingung und -regel erstellt, die für den Testlink http://website.com/test.xml/ einwandfrei funktioniert.

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

Das Problem ist, wenn ich die Regel in WordPress .htaccess Datei platziere, funktioniert es überhaupt nicht! Scheint, als ob WordPress oder YOAST Permalink die Regel außer Kraft setzen. Bitte helfen Sie!

# 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

Hinweis:

Bitte beachten Sie, dass dies keine physische Datei ist. Verwenden Sie Rewrite-Regeln, um eine Sitemap während der Ausführung zu generieren! Dies ist tatsächlich eine WordPress-Seite!

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

1
Hassan Alvi

Was genau für mich geklappt hat ..

Das Problem war auf kanonische WordPress-Weiterleitungen zurückzuführen. Die Verwendung von /%postname%/ in der Permalink-Struktur führte dazu, dass die benutzerdefinierte Vorlage an die URL mit dem abschließenden Schrägstrich weitergeleitet wurde.

Ich habe einfach den template_redirect-Filter für kanonische Weiterleitungen entfernt. Jetzt funktioniert der Link in beiden Fällen, d. H. Mit oder ohne abschließenden Schrägstrich.

Hier ist mein Referenzcode. 1234 ist die Beispielseiten-ID für die Vorlage, die zum Generieren einer dynamischen Sitemap verwendet wird.

//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]

Dies sollte eine externe Umleitung sein, nicht eine interne Umschreibung . (Andernfalls sieht es nicht so aus, als würde sich nichts ändern, da sich die sichtbare URL nicht ändert.) Sie benötigen also das Flag R (redirect). Zum Beispiel:

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

Dies ist eine temporäre (302) Umleitung. Ändern Sie R in R=301, um eine permanente (301) Weiterleitung zu erstellen - aber nur, wenn Sie sicher sind, dass die Weiterleitung ordnungsgemäß funktioniert. (Da 301s vom Browser hart zwischengespeichert werden und das Testen problematisch machen können.)

Sie benötigen jedoch nicht die Anweisung RewriteCond. Dies kann in einer einzelnen RewriteRule erfolgen (dies ist auch effizienter). Dies sollte auch nach vor Ihren vorhandenen internen Umschreibungen und idealerweise nach vor dem # BEGIN WordPress-Block gehen, da sonst Ihre Anpassungen in zukünftigen Updates überschrieben werden könnten.

Alles, was Sie brauchen, ist (am Anfang Ihrer Datei):

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

Denken Sie daran, wörtliche Punkte in Ihrem Regex zu vermeiden.

UPDATE: Und ja, das sollte $1 sein (als Rückverweis auf RewriteRule pattern ) im Gegensatz zu %1 (als Rückverweis auf das zuletzt gefundene CondPattern ).

1
MrWhite

Wenn Sie eine Sitemap ausgeben, gibt es keinen Grund, auf die Abfrage Ihrer Seite zu warten.

Wenn Sie eine frühere Aktion ausführen, brauchen Sie nichts, um dem abschließenden Schrägstrich entgegenzuwirken, da dies nicht der Fall ist.

EDIT

Hier ist eine vollständige Version mit der Registrierung von Abfragevariablen, Regeln und parse_request-Aktionen:

// 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