PluginProbe
Redirection / 3.7.2
Redirection v3.7.2
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.7.2, at modules/wordpress.php

219 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, array( $this, 'only_404' ) ) );
67
68 if ( count( $page_type ) > 0 ) {
69 $url = apply_filters( 'redirection_url_source', Redirection_Request::get_request_url() );
70 $first = $page_type[0];
71 $first->matches( $url );
72 return true;
73 }
74
75 return false;
76 }
77
78 private function only_404( $redirect ) {
79 return $redirect->match->get_type() === 'page';
80 }
81
82 // Return true to stop further processing of the 'do nothing'
83 public function redirection_do_nothing() {
84 $this->can_log = false;
85 return true;
86 }
87
88 public function redirection_visit( $redirect, $url, $target ) {
89 $redirect->visit( $url, $target );
90 }
91
92 public function force_https() {
93 $options = red_get_options();
94
95 if ( $options['https'] && ! is_ssl() ) {
96 $target = rtrim( Redirection_Request::get_server_name(), '/' ) . esc_url_raw( Redirection_Request::get_request_url() );
97 wp_safe_redirect( 'https://' . $target, 301 );
98 die();
99 }
100 }
101
102 public function init() {
103 $url = apply_filters( 'redirection_url_source', Redirection_Request::get_request_url() );
104
105 // Make sure we don't try and redirect something essential
106 if ( $url && ! $this->protected_url( $url ) && $this->matched === false ) {
107 do_action( 'redirection_first', $url, $this );
108
109 $redirects = Red_Item::get_for_url( $url );
110
111 foreach ( (array) $redirects as $item ) {
112 if ( $item->matches( $url ) ) {
113 $this->matched = $item;
114 break;
115 }
116 }
117
118 do_action( 'redirection_last', $url, $this );
119
120 if ( ! $this->matched ) {
121 // Keep them for later
122 $this->redirects = $redirects;
123 }
124 }
125 }
126
127 /**
128 * Protect certain URLs from being redirected. Note we don't need to protect wp-admin, as this code doesn't run there
129 */
130 private function protected_url( $url ) {
131 $rest = wp_parse_url( red_get_rest_api() );
132 $rest_api = $rest['path'] . ( isset( $rest['query'] ) ? '?' . $rest['query'] : '' );
133
134 if ( substr( $url, 0, strlen( $rest_api ) ) === $rest_api ) {
135 // Never redirect the REST API
136 return true;
137 }
138
139 return false;
140 }
141
142 public function status_header( $status ) {
143 // Fix for incorrect headers sent when using FastCGI/IIS
144 if ( substr( php_sapi_name(), 0, 3 ) === 'cgi' ) {
145 return str_replace( 'HTTP/1.1', 'Status:', $status );
146 }
147
148 return $status;
149 }
150
151 public function send_headers( $obj ) {
152 if ( ! empty( $this->matched ) && $this->matched->match->action_code === '410' ) {
153 add_filter( 'status_header', array( $this, 'set_header_410' ) );
154 }
155 }
156
157 public function set_header_410() {
158 return 'HTTP/1.1 410 Gone';
159 }
160
161 public function wp_redirect( $url, $status ) {
162 global $wp_version, $is_IIS;
163
164 if ( $is_IIS ) {
165 header( "Refresh: 0;url=$url" );
166 return $url;
167 }
168
169 if ( $status === 301 && php_sapi_name() === 'cgi-fcgi' ) {
170 $servers_to_check = array( 'lighttpd', 'nginx' );
171
172 foreach ( $servers_to_check as $name ) {
173 if ( isset( $_SERVER['SERVER_SOFTWARE'] ) && stripos( $_SERVER['SERVER_SOFTWARE'], $name ) !== false ) {
174 status_header( $status );
175 header( "Location: $url" );
176 exit( 0 );
177 }
178 }
179 }
180
181 if ( intval( $status, 10 ) === 307 ) {
182 status_header( $status );
183 nocache_headers();
184 return $url;
185 }
186
187 $options = red_get_options();
188
189 // Do we need to set the cache header?
190 if ( ! headers_sent() && isset( $options['redirect_cache'] ) && $options['redirect_cache'] !== 0 && intval( $status, 10 ) === 301 ) {
191 if ( $options['redirect_cache'] === -1 ) {
192 // No cache - just use WP function
193 nocache_headers();
194 } else {
195 // Custom cache
196 header( 'Expires: ' . gmdate( 'D, d M Y H:i:s T', time() + $options['redirect_cache'] * 60 * 60 ) );
197 header( 'Cache-Control: max-age=' . $options['redirect_cache'] * 60 * 60 );
198 }
199 }
200
201 status_header( $status );
202 return $url;
203 }
204
205 public function update( array $data ) {
206 return false;
207 }
208
209 protected function load( $options ) {
210 }
211
212 protected function flush_module() {
213 }
214
215 public function reset() {
216 $this->can_log = true;
217 }
218 }
219