PluginProbe
Redirection / 3.6
Redirection v3.6
5.10.0 5.9.0 5.8.1 5.8.0 3.7.2 3.7.3 4.0 4.0.1 4.1 4.1.1 4.2 4.2.1 4.2.2 4.2.3 4.3 4.3.1 4.3.2 4.3.3 4.4 4.4.1 4.4.2 4.5 4.5.1 4.6.2 4.7.1 All 130 releases
redirection / modules / wordpress.php

wordpress.php in Redirection 3.6, at modules/wordpress.php

217 lines 5.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 class WordPress_Module extends Red_Module {
4 const MODULE_ID = 1;
5
6 private $matched = false;
7 private $can_log = true;
8
9 public function get_id() {
10 return self::MODULE_ID;
11 }
12
13 public function get_name() {
14 return 'WordPress';
15 }
16
17 public function start() {
18 // Setup the various filters and actions that allow Redirection to happen
19 add_action( 'init', array( $this, 'init' ) );
20 add_action( 'init', array( $this, 'force_https' ) );
21 add_action( 'send_headers', array( $this, 'send_headers' ) );
22 add_filter( 'wp_redirect', array( $this, 'wp_redirect' ), 1, 2 );
23 add_action( 'redirection_visit', array( $this, 'redirection_visit' ), 10, 3 );
24 add_action( 'redirection_do_nothing', array( $this, 'redirection_do_nothing' ) );
25 add_filter( 'redirect_canonical', array( $this, 'redirect_canonical' ), 10, 2 );
26 add_action( 'template_redirect', array( $this, 'template_redirect' ) );
27
28 // Remove WordPress 2.3 redirection
29 remove_action( 'template_redirect', 'wp_old_slug_redirect' );
30 }
31
32 /**
33 * This ensures that a matched URL is not overriddden by WordPress, if the URL happens to be a WordPress URL of some kind
34 * For example: /?author=1 will be redirected to /author/name unless this returns false
35 */
36 public function redirect_canonical( $redirect_url, $requested_url ) {
37 if ( $this->matched ) {
38 return false;
39 }
40
41 return $redirect_url;
42 }
43
44 public function template_redirect() {
45 if ( ! is_404() || $this->matched ) {
46 return;
47 }
48
49 if ( $this->match_404_type() ) {
50 // Don't log an intentionally redirected 404
51 return;
52 }
53
54 $options = red_get_options();
55
56 if ( isset( $options['expire_404'] ) && $options['expire_404'] >= 0 && apply_filters( 'redirection_log_404', $this->can_log ) ) {
57 RE_404::create( Redirection_Request::get_request_url(), Redirection_Request::get_user_agent(), Redirection_Request::get_ip(), Redirection_Request::get_referrer() );
58 }
59 }
60
61 private function match_404_type() {
62 if ( ! property_exists( $this, 'redirects' ) || count( $this->redirects ) === 0 ) {
63 return false;
64 }
65
66 $page_type = array_values( array_filter( $this->redirects, function( $redirect ) {
67 return $redirect->match->get_type() === 'page';
68 } ) );
69
70 if ( count( $page_type ) > 0 ) {
71 $url = apply_filters( 'redirection_url_source', Redirection_Request::get_request_url() );
72 $first = $page_type[0];
73 $first->matches( $url );
74 return true;
75 }
76
77 return false;
78 }
79
80 // Return true to stop further processing of the 'do nothing'
81 public function redirection_do_nothing() {
82 $this->can_log = false;
83 return true;
84 }
85
86 public function redirection_visit( $redirect, $url, $target ) {
87 $redirect->visit( $url, $target );
88 }
89
90 public function force_https() {
91 $options = red_get_options();
92
93 if ( $options['https'] && ! is_ssl() ) {
94 $target = rtrim( Redirection_Request::get_server_name(), '/' ) . esc_url_raw( Redirection_Request::get_request_url() );
95 wp_safe_redirect( 'https://' . $target, 301 );
96 die();
97 }
98 }
99
100 public function init() {
101 $url = apply_filters( 'redirection_url_source', Redirection_Request::get_request_url() );
102
103 // Make sure we don't try and redirect something essential
104 if ( $url && ! $this->protected_url( $url ) && $this->matched === false ) {
105 do_action( 'redirection_first', $url, $this );
106
107 $redirects = Red_Item::get_for_url( $url, 'wp' );
108
109 foreach ( (array) $redirects as $item ) {
110 if ( $item->matches( $url ) ) {
111 $this->matched = $item;
112 break;
113 }
114 }
115
116 do_action( 'redirection_last', $url, $this );
117
118 if ( ! $this->matched ) {
119 // Keep them for later
120 $this->redirects = $redirects;
121 }
122 }
123 }
124
125 /**
126 * Protect certain URLs from being redirected. Note we don't need to protect wp-admin, as this code doesn't run there
127 */
128 private function protected_url( $url ) {
129 $rest = wp_parse_url( red_get_rest_api() );
130 $rest_api = $rest['path'] . ( isset( $rest['query'] ) ? '?' . $rest['query'] : '' );
131
132 if ( substr( $url, 0, strlen( $rest_api ) ) === $rest_api ) {
133 // Never redirect the REST API
134 return true;
135 }
136
137 return false;
138 }
139
140 public function status_header( $status ) {
141 // Fix for incorrect headers sent when using FastCGI/IIS
142 if ( substr( php_sapi_name(), 0, 3 ) === 'cgi' ) {
143 return str_replace( 'HTTP/1.1', 'Status:', $status );
144 }
145
146 return $status;
147 }
148
149 public function send_headers( $obj ) {
150 if ( ! empty( $this->matched ) && $this->matched->match->action_code === '410' ) {
151 add_filter( 'status_header', array( $this, 'set_header_410' ) );
152 }
153 }
154
155 public function set_header_410() {
156 return 'HTTP/1.1 410 Gone';
157 }
158
159 public function wp_redirect( $url, $status ) {
160 global $wp_version, $is_IIS;
161
162 if ( $is_IIS ) {
163 header( "Refresh: 0;url=$url" );
164 return $url;
165 }
166
167 if ( $status === 301 && php_sapi_name() === 'cgi-fcgi' ) {
168 $servers_to_check = array( 'lighttpd', 'nginx' );
169
170 foreach ( $servers_to_check as $name ) {
171 if ( isset( $_SERVER['SERVER_SOFTWARE'] ) && stripos( $_SERVER['SERVER_SOFTWARE'], $name ) !== false ) {
172 status_header( $status );
173 header( "Location: $url" );
174 exit( 0 );
175 }
176 }
177 }
178
179 if ( intval( $status, 10 ) === 307 ) {
180 status_header( $status );
181 nocache_headers();
182 return $url;
183 }
184
185 $options = red_get_options();
186
187 // Do we need to set the cache header?
188 if ( ! headers_sent() && isset( $options['redirect_cache'] ) && $options['redirect_cache'] !== 0 && intval( $status, 10 ) === 301 ) {
189 if ( $options['redirect_cache'] === -1 ) {
190 // No cache - just use WP function
191 nocache_headers();
192 } else {
193 // Custom cache
194 header( 'Expires: ' . gmdate( 'D, d M Y H:i:s T', time() + $options['redirect_cache'] * 60 * 60 ) );
195 header( 'Cache-Control: max-age=' . $options['redirect_cache'] * 60 * 60 );
196 }
197 }
198
199 status_header( $status );
200 return $url;
201 }
202
203 public function update( array $data ) {
204 return false;
205 }
206
207 protected function load( $options ) {
208 }
209
210 protected function flush_module() {
211 }
212
213 public function reset() {
214 $this->can_log = true;
215 }
216 }
217