Tôi có thể đặt $ _SERVER ['REDIRECT_URL'] trên toàn cầu trước khi thực thi tập lệnh không?


8

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.


-1 cho việc không thể hiện sự siêng năng. Tìm kiếm nhanh trên Google không thay thế cho việc đọc tài liệu. Trước khi nâng cấp hệ thống hoặc mã, bạn nên đảm bảo bạn hiểu những gì đã thay đổi, ít nhất là nó ảnh hưởng đến hệ thống hoặc dự án của bạn.
John Gardeniers

Xin lỗi vì không rõ ràng; Tôi đọc tài liệu tốt nhất có thể. Sau đó, tôi đã nhờ đến Google khi tôi nghĩ ra điều gì đó mà tôi không thể giải thích. Cấu hình nằm trên một máy riêng biệt và trong quá trình thử nghiệm trước khi di chuyển tôi đã phát hiện ra vấn đề trên. Tuy nhiên, tôi đã tìm thấy một lỗi tôi đã mắc phải, vì vậy tôi sẽ cập nhật câu hỏi.
Barry

đó thực sự là lợi ích của cả bạn và chúng tôi nếu bạn cho chúng tôi biết những điều này. Tôi đã đảo ngược phiếu bầu của tôi.
John Gardeniers

Bạn có thể cho chúng tôi biết thêm thông tin về cấu hình máy chủ trước và mới không? Tôi nghĩ rằng cài đặt REDIRECT_URL trong PHP xuất phát từ biến môi trường SCRIPT_URL trong apache, nhưng có nhiều điều có thể sửa đổi hành vi của nhập đó (ví dụ: suPHP, công cụ gói, câu lệnh AddTypeHandler, v.v.).
Jon Kloske

Câu trả lời:


3

REDIRECT_URL chỉ được đặt bởi máy chủ web Apache và chỉ trong một số trường hợp nhất định . Nó có thể không phải là một cái gì đó mà mã của bạn nên dựa vào. Theo như tôi có thể nói, giải pháp tốt nhất sẽ là sửa mã PHP bị lỗi; bạn thực sự không thể buộc điều này luôn được đặt trong Apache.


Cảm ơn phản hồi, mặc dù tôi không thể thấy bất cứ điều gì trên liên kết đó liên quan đến vấn đề của tôi. Tôi không nghĩ rằng ErrorDocument bên ngoài có liên quan đến việc này. Tôi ước tôi có thể thay đổi mã hiện có, nhưng đó không phải là một lựa chọn tại thời điểm này.
Barry

Vấn đề là, REDIRECT_URL chỉ được đặt trong quá trình xử lý ErrorDocument. Điều đó có nghĩa là các tập lệnh PHP của bạn đã được tải dưới dạng ErrorDocument trong cấu hình ban đầu và bất cứ ai đã viết chúng đều dựa vào hành vi này. Bây giờ nó không xảy ra, các kịch bản bị phá vỡ.
Michael Hampton

Không có định nghĩa ErrorDocument nào được sử dụng và tôi không thể thấy mod_rewrite RewriteRule (đã thêm ở trên) liên quan đến một định nghĩa như thế nào. Tôi không đồng ý với bạn về việc REDIRECT_URL không được đảm bảo, tôi chỉ không thể tìm thấy bất kỳ tài liệu liên quan nào về lý do tại sao.
Barry

Tôi liên kết với nó ở trên trong câu trả lời của tôi. Nếu bạn cần một cái gì đó xa hơn, bạn sẽ phải đọc mã nguồn Apache. Dù sao, hãy nhớ chấp nhận câu trả lời đã giải quyết vấn đề của bạn bằng cách nhấp vào phác thảo của dấu kiểm bên cạnh và chào mừng bạn đến với Server Fault.
Michael Hampton

0

Theo tài liệu của PHP:

$ _SERVER là một mảng chứa thông tin như tiêu đề, đường dẫn và vị trí tập lệnh. Các mục trong mảng này được tạo bởi máy chủ web. Không có gì đảm bảo rằng mọi máy chủ web sẽ cung cấp bất kỳ thứ nào trong số này; máy chủ có thể bỏ qua một số hoặc cung cấp những cái khác không được liệt kê ở đây. Điều đó nói rằng, một số lượng lớn các biến này được tính trong đặc tả »CGI / 1.1 , do đó bạn có thể mong đợi các biến đó.

Vì vậy, có vẻ như không phải tất cả các $_SERVERbiến siêu lớp đều là bất khả tri như người ta mong đợi. $_SERVER['REQUEST_URI']dường như là một giá trị như vậy được xác định nhất quán bởi tất cả các máy chủ web chính vì vậy bạn có thể muốn thử sử dụng thay thế.


Cảm ơn vì điều này, nhưng tôi đã nhận ra rằng đôi khi điều này được thiết lập, và đôi khi không. Điều tôi hy vọng là một cách để chủ động ảnh hưởng đến các biến được đặt cho cấu hình cụ thể của tôi, vì tôi không thể tìm thấy bất kỳ tài liệu nào về các chi tiết cụ thể dựa trên cấu hình của mình (ví dụ: làm thế nào tôi biết trước khi xây dựng môi trường).
Barry

0

Đối với các hình ảnh bị thiếu trong một trong các dự án của chúng tôi, nơi được chuyển hướng đến index.php, tôi chỉ sử dụng cách khắc phục này:

url: http://www.domanXY.de/image.php?file=var/binaries/store/8dfaadde-5309-4a35-8f9a-d8b9cd807aae.jpg&options=&options=resize_outer(320,150);sharpen(64) ;

<?php
//image.php (newly created)
$_SERVER['REDIRECT_URL'] = "image.php";
include "index.php";

Nếu bạn muốn một giải pháp toàn cầu, tôi nghĩ rằng bạn phải sử dụng explode (), v.v. và sử dụng một Biến khác đã cho như $ _SERVER ['REQUEST_URI'].


-1

Bạn có thể đặt tệp tự động chuẩn bị php để bao gồm một đoạn mã PHP nhỏ đặt biến này.


Trong câu hỏi của tôi, tôi đã xác định đây là quá trình hành động tôi sẽ thực hiện nếu không thể. Đó cũng là những gì tôi đã làm, theo chỉnh sửa tôi đã thực hiện trước khi bạn trả lời.
Barry

Xin lỗi, tôi không nhớ đã xem bản chỉnh sửa trước khi đăng; Có thể tôi đã bắt đầu trả lời trước khi bạn thực hiện chỉnh sửa, nhưng tôi không thể chắc chắn vì lần chỉnh sửa tiếp theo đã xóa dấu thời gian chỉnh sửa ban đầu: / Tôi cũng nên nói rõ hơn rằng những gì tôi đang đề xuất có lẽ là cách chính xác để đạt được những gì bạn đang theo đuổi, thay vì "dự phòng". Bạn có thể sử dụng cờ [E: blah = blah] cho các quy tắc viết lại để đặt các biến môi trường tùy ý để sau đó tìm nạp bên trong tệp bao gồm trước sạch hơn so với sử dụng biến GET để chuyển nội dung từ công cụ chuyển hướng sang mã của bạn.
Jon Kloske

Và bởi "có lẽ đúng", ý tôi là đó là cách tôi đã làm điều chính xác này ở một số nơi trong quá khứ.
Jon Kloske
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.