2011-10-04 30 views
8

Tôi muốn chuyển hướng mọi yêu cầu chứa dấu gạch dưới đến cùng một url, nhưng với dấu gạch nối thay thế url. Tôi đã nhìn thấy rất nhiều diễn đàn đề nghị tôi làm một cái gì đó như thế này:Trong htaccess, tôi muốn thay thế dấu gạch dưới bằng dấu gạch nối và sau đó chuyển hướng người dùng url mới

(Lặp lại một phiên bản tăng lên của RewriteRule này lên đến một 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] 

giải pháp hiện tại của tôi trong php là (mà hoạt động tốt) :

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

Nhưng, tôi không muốn sử dụng php & thay vì giữ nó trong tập tin htaccess của tôi mà không cần phải lặp lại rằng RewriteRule đầu tiên hơn và hơn nữa để dự đoán bao nhiêu nhấn mạnh từng url có thể. Suy nghĩ? Có cách nào để làm điều này với lặp lại lặp lại increriteRule?

----- chỉnh sửa -----

file .htaccess hiện tại của tôi chỉ là WordPress chuẩn một, mà là dưới đây:

<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

Đây là cách duy nhất tôi xem nó hoạt động, bạn không có Replaces trong mod viết lại, chỉ viết lại quy tắc với các mẫu phù hợp. –

Trả lời

4

Hãy xem phần "Next" chỉ thị/viết lại lá cờ, gây ruleset được đánh giá lại bắt đầu với những quy tắc đầu tiên: http://httpd.apache.org/docs/current/rewrite/flags.html#flag_n

Something như thế này có thể làm việc:

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

Đã thử nghiệm, nó hoạt động! 1 cho sự thông minh. –

+0

@llmari Karonen - Tôi tò mò, bạn đã sử dụng url nào để kiểm tra điều này? – Schoffelman

+0

Tôi đã sử dụng điều này làm quy tắc RewriteRule^([^ _] *) _ (. *) $/$ 1- $ 2 [R = 301, L] – Schoffelman

0

Làm thế nào về kết hợp 2. Có quy tắc viết lại đơn ghi đè lên tập lệnh PHP thực hiện thay thế và chuyển hướng. Bằng cách đó bạn tránh có nhiều quy tắc viết lại, có thể xử lý bất kỳ số dấu gạch dưới nào và chỉ gọi chuyển hướng PHP khi cần.

Các vấn đề liên quan