Tôi đang trong quá trình di chuyển nhiều trang web từ cấu hình máy chủ cũ sang cấu hình máy chủ mới. Mỗi trang web được dựa trên một cơ sở mã tương tự (nhưng đáng buồn là không giống hệt nhau), sử dụng URL mod_rewrite.
- Ubuntu 8.04 LTS => Ubuntu 12.04 LTS
- Apache 2.22.8 => Apache 2.2.22
- PHP 5.2 (FastCGI) => PHP 5.3 (PHP5-FPM)
Chủ yếu hoạt động như một bùa mê, nhưng trên cấu hình mới, $ _SERVER ['REDIRECT_URL'] không còn được đặt và mã bị lỗi do phụ thuộc vào biến toàn cục này.
Theo những gì tôi hiểu, biến này được Apache đặt khi chuyển hướng xảy ra. Rõ ràng điều này không xảy ra bây giờ, nhưng tôi đang đấu tranh để tìm ra nguyên nhân.
- Đây có phải là bản nâng cấp của Apache hay (theo dự đoán của tôi) việc chuyển đổi từ PHP FastCGI sang PHP5-FPM?
- Làm thế nào để tôi lấy lại biến này?
Tôi thực sự không cần phải chỉnh sửa mã trên mỗi trang web, vì vậy tôi sẽ đặt auto_prepend toàn cầu nếu cần, nhưng lý tưởng nhất là tôi muốn sửa cấu hình máy chủ và đặt nó ở vị trí đầu tiên.
Có khả năng liên quan: Bây giờ tôi cũng có một vài biến $ _SERVER mới, cụ thể là REDIRECT_SCRIPT_URL và REDIRECT_REDIRECT_SCRIPT_URL. Chúng dường như có dữ liệu chính xác mà tôi muốn cho REDIRECT_URL, nhưng dường như cũng chỉ ra rằng có hai chuyển hướng nội bộ xảy ra trước đây - Google tìm kiếm REDIRECT_REDIRECT_SCRIPT_URL chỉ trả về kết quả đầu ra ngẫu nhiên. SCRIPT_URL có phải là REDIRECT_URL mới không?
Chỉnh sửa 1
Kiểm tra lại REDIRECT_URL được đặt (ngay bây giờ), nhưng luôn luôn thành 'index.php' (mục tiêu mod_rewrite) thay vì URL được nhập dự kiến. Tôi đã sử dụng PHP auto_prepend_file để đặt thủ công biến cần thiết.
Tôi không chắc là tôi đã bỏ lỡ nó như thế nào trong lần đầu tiên, nhưng tôi đã thực hiện một số thay đổi trong thời gian đó vì vậy tôi cho rằng có một cơ hội bên ngoài nó không có ở đó. Xin lỗi nếu điều này đánh lừa bất cứ ai.
Chỉnh sửa 2
Để giải quyết các đề cập của ErrorDocument bên dưới, quy tắc mod_rewrite đang sử dụng là:
RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]
Biến $ _GET ['url'] được đặt, do đó quy tắc phải hoạt động.
Để rõ ràng, ở giai đoạn này tôi đã sử dụng cách giải quyết auto_prepend_file mà tôi đã đề cập ban đầu.