2011-10-04 7 views
8

Chciałbym przekierować dowolne żądanie zawierające podkreślenia do tego samego adresu URL, ale z łącznikami zastępującymi adresy URL. Widziałem wiele forów sugerują zrobić coś takiego:W htaccess chciałbym zastąpić podkreślenia myślnikami, a następnie przekierować użytkownika do nowego adresu URL.

(Powtarzanie zwiększany wersję tego RewriteRule aż do gazillion)

rewriteRule ^([^_]*)_([^_]*)_([^_]*)_(.*)$ http://example.com/$1-$2-$3-$4 [R=301,L] 
rewriteRule ^([^_]*)_([^_]*)_(.*)$ http://example.com/$1-$2-$3 [R=301,L] 
rewriteRule ^([^_]*)_(.*)$ http://example.com/$1-$2 [R=301,L] 

Moje obecne rozwiązanie w PHP (które działa prawidłowo) :

if(preg_match('/[_]+/', $_SERVER['REQUEST_URI'])){ 
    $redirectUrl = preg_replace('/[_]+/','-', $_SERVER['REQUEST_URI']); 
    header('Location: '. $redirectUrl , TRUE, 301); 
    return; 
} 

Ale Wolałbym nie używać php & zamiast trzymać go w moim pliku .htaccess bez konieczności powtarzania tej pierwszej RewriteRule w kółko, aby przewidzieć, ile podkreśla każdy adres URL może być. Myśli? Czy jest taki sposób, aby to zrobić bez powtarzania zwiększonego przepisu ponownego zapisu?

----- edit -----

Mój obecny plik .htaccess jest po prostu średnia WordPress jeden, który znajduje się poniżej:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 
+0

Jest to jedyny sposób, w jaki zobacz, jak działa, nie masz Zastępów w przepisywaniu mod, tylko przepisywanie reguł z dopasowanymi wzorami. –

Odpowiedz

4

Patrz „Dalej” flagę dyrektywa/przepisywania, który powoduje, że zestaw reguł, aby zostać ponownie począwszy od pierwszej zasady: http://httpd.apache.org/docs/current/rewrite/flags.html#flag_n

Coś jak to może działać:

RewriteRule (.*)_(.*) $1-$2 [N] 
+1

Testowany, działa! +1 za spryt. –

+0

@marmari Karonen - Ciekawi mnie, jaki URL użyłeś do przetestowania tego? – Schoffelman

+0

Skończyło się na tym, że używam tego jako reguły RewriteRule^([^ _] *) _ (. *) $/$ 1- $ 2 [R = 301, L] – Schoffelman

0

Jak o łącząc 2. Mieć pojedyncza reguła przepisywania, która przepisuje na skrypt PHP, który dokonuje podstawienia i przekierowania. W ten sposób unikniesz wielokrotnych reguł przepisywania, możesz obsłużyć dowolną liczbę podkreśleń i wywołać przekierowanie PHP tylko wtedy, gdy jest to potrzebne.

Powiązane problemy