2009-01-31 47 views
9

Tôi đang cố gắng tạo URL sạch trên trang web của mình. Bây giờ tôi đã thành công trong việc cấu hình apache nên mọi yêu cầu như mysite.com/page sẽ hoạt động. Nhưng tôi cũng muốn các yêu cầu đó cho mysite.com/page.php sẽ được chuyển hướng đến mysite.com/page. Tôi đã thiết lập biến môi trường trong .htaccess để kiểm tra xem tôi đã được chuyển hướng đến ngăn chặn vòng lặp, nhưng tôi vẫn nhận được chúng ... Đây là .htaccess:Làm sạch URL chuyển hướng vòng lặp

<IfModule mod_rewrite.c> 
Options +FollowSymlinks 

RewriteEngine On 
RewriteBase/

# set the variable 
RewriteRule ^$ - [L] 
RewriteRule ^(.*)$ $1 [E=REWROTE:0] 

# this works fine 
# make mysite.com/page work and set REWROTE variable to 1 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php [L,E=REWROTE:1] 

# but if i enable this, i get redirected and then stuck in a loop 
# redirect mysite.com/page.php to mysite.com/page , but only if REWROTE not 1 
#RewriteCond %{ENV:REWROTE} !^1$ 
#RewriteRule ^(.*)\.php$ $1 [R=301,L] 

Cảm ơn!

+0

Chào mừng bạn đến ngăn xếp tràn. Cảm ơn bạn đã đặt câu hỏi rõ ràng, cung cấp mã và hiển thị những gì hiệu quả và những gì không hiệu quả. Nếu bạn có thông tin hữu ích trong nhật ký apache của mình, vui lòng đăng thông tin đó lên. Đôi khi các vấn đề chuyển hướng trở nên rõ ràng hơn khi bạn nhìn thấy các bản ghi. –

+0

Rất tiếc, tôi không có quyền truy cập vào loại thông tin đó. – oxeleo

Trả lời

14

Thêm quy tắc này trên viết lại quy tắc hiện tại của bạn để ngăn chặn chuyển hướng nếu yêu cầu đã được chuyển hướng một lần (ref):

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule .* - [L] 
+0

Bingo! Làm việc như say mê và không cần biến môi trường. – oxeleo

1

Bạn có thể kiểm tra các dòng yêu cầu cho những gì đã ban được yêu cầu:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ (/[^\ ]*)\.php[?\ ] 
RewriteRule \.php$ %1 [R=301,L] 

Ồ, và đối số đầu tiên của RewriteCond directive không phải là cụm từ thông dụng mà chỉ là một chuỗi. Vì vậy, việc thoát khỏi . là sai.

+0

Cảm ơn, điều này đã làm việc cho tôi :) –

0

Có lý do nào khiến bạn không thể sử dụng ký tự chấm dứt chuỗi cuối, $?

RewriteRule ^/(.+)\.php$ /$1 

sẽ chuyển hướng /page.php đến/trang nhưng sẽ không thực hiện bất kỳ chuyển hướng nào trên/trang.

Về cơ bản, việc sử dụng các kỹ thuật như đặt biến môi trường và thêm kiểm tra cho REDIRECT_STATUS sẽ không thực sự mạnh mẽ.

0

một cách nhanh chóng khác & cách bẩn để ngăn vòng lặp trong các trường hợp này mà tôi đã tìm thấy là thêm chuỗi truy vấn và sau đó kiểm tra sự tồn tại của nó trong chuyển hướng.

RewriteCond %{QUERY_STRING} !a=a 
RewriteRule ^(.*)\.php$ %1 [NC,R=301,L] 
RewriteRule ^(.*)$ $1.php?a=a [NC,L] 

tìm thấy trên trang web này: http://answers.oreilly.com/topic/542-how-to-properly-redirect-for-maximum-seo/

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