2011-01-31 32 views
7

Tôi có một trang web có một tập hợp các trang .html và .php cũ đã được đưa vào CMS.Sử dụng mod_rewrite và mod_alias (chuyển hướng 301) cùng nhau trong .htaccess?

Hiện nay trong file .htaccess có khoảng 30 mod_alias chuyển hướng theo hình thức sau:

redirect 301 /oldpage1.html http://www.example.com/newpage1.php 
redirect 301 /oldpage2.php http://www.example.com/newpage2.php 
redirect 301 /oldpage3.php http://www.example.com/newpage3.php 

Nhưng chúng tôi muốn sử dụng mod_rewrite để có URL khá trong CMS của chúng tôi, điều này sẽ mang hình thức http://www.example.com/pagename.php, vì vậy cũng có những điều sau đây:

RewriteEngine on 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ index.php?page=$1 

tại thời điểm cả hai đang được áp dụng với nhau, mà kết quả trong:

http://www.example.com/newpage1.php?page=oldpage1.html 

Làm thế nào tôi có thể áp dụng các quy tắc viết lại chỉ khi không phù hợp đã được thực hiện bởi các mod_alias redirect 301 báo cáo, do đó sau đây xảy ra:

http://www.example.com/oldpage1.html -> chuyển hướng đến -> http://www.example.com/newpage1.php -> được coi là - > http://www.example.com/index.php?page=/newpage1.php

Bất kỳ gợi ý nào sẽ được đánh giá rất nhiều? Cảm ơn.

Trả lời

10

Tôi tìm thấy câu trả lời trong một great explanation of mod_rewrite and mod_alias

Vấn đề là mod_rewrite luôn xảy ra trước mod_alias, không phụ thuộc vào trật tự đang đặt trong .htaccess. Đây là sự đảo ngược thứ tự cần thiết cho tình huống này.

Bí quyết là sử dụng RewriteRule [R=301] thay vì redirect 301 và do đó sử dụng mod_rewrite cho mọi thứ thay vì trộn với mod_alias.

Giải pháp đầy đủ như sau:

RewriteEngine on 
RewriteBase/

RewriteRule ^oldpage1.html /newpage1.php [R=301,L] 
RewriteRule ^oldpage2.php /newpage2.php [R=301,L] 
RewriteRule ^oldpage3.php /newpage3.php [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ index.php?page=$1 
Các vấn đề liên quan