[ticket/11824] Add option for mod_rewrite

PHPBB3-11824
This commit is contained in:
David King 2013-09-03 16:16:23 -07:00
parent 8d6b03c438
commit 010da72f64
8 changed files with 109 additions and 33 deletions

View file

@ -90,7 +90,7 @@ services:
arguments: arguments:
- @template - @template
- @user - @user
- @request - @config
- %core.root_path% - %core.root_path%
- %core.php_ext% - %core.php_ext%

View file

@ -375,6 +375,7 @@ class acp_board
'use_system_cron' => array('lang' => 'USE_SYSTEM_CRON', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'use_system_cron' => array('lang' => 'USE_SYSTEM_CRON', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'legend2' => 'PATH_SETTINGS', 'legend2' => 'PATH_SETTINGS',
'enable_mod_rewrite' => array('lang' => 'MOD_REWRITE_ENABLE', 'validate' => 'bool', 'type' => 'custom', 'method' => 'enable_mod_rewrite', 'explain' => true),
'smilies_path' => array('lang' => 'SMILIES_PATH', 'validate' => 'rpath', 'type' => 'text:20:255', 'explain' => true), 'smilies_path' => array('lang' => 'SMILIES_PATH', 'validate' => 'rpath', 'type' => 'text:20:255', 'explain' => true),
'icons_path' => array('lang' => 'ICONS_PATH', 'validate' => 'rpath', 'type' => 'text:20:255', 'explain' => true), 'icons_path' => array('lang' => 'ICONS_PATH', 'validate' => 'rpath', 'type' => 'text:20:255', 'explain' => true),
'upload_icons_path' => array('lang' => 'UPLOAD_ICONS_PATH', 'validate' => 'rpath', 'type' => 'text:20:255', 'explain' => true), 'upload_icons_path' => array('lang' => 'UPLOAD_ICONS_PATH', 'validate' => 'rpath', 'type' => 'text:20:255', 'explain' => true),
@ -994,4 +995,51 @@ class acp_board
$cache->destroy('sql', FORUMS_TABLE); $cache->destroy('sql', FORUMS_TABLE);
} }
/**
* Option to enable/disable removal of 'app.php' from URLs
*
* Note that if mod_rewrite is on, URLs without app.php will still work,
* but any paths generated by the controller helper url() method will
* contain app.php.
*
* @param int $value The current config value
* @param string $key The config key
* @return string The HTML for the form field
*/
function enable_mod_rewrite($value, $key)
{
global $user, $config;
// Determine whether mod_rewrite is enabled on the server
// NOTE: This only works on Apache servers on which PHP is NOT
// installed as CGI. In that case, there is no way for PHP to
// determine whether or not the Apache module is enabled.
//
// To be clear on the value of $mod_rewite:
// null = Cannot determine whether or not the server has mod_rewrite
// enabled
// false = Can determine that the server does NOT have mod_rewrite
// enabled
// true = Can determine that the server DOES have mod_rewrite_enabled
$mod_rewrite = null;
if (function_exists('apache_get_modules'))
{
$mod_rewrite = (bool) in_array('mod_rewrite', apache_get_modules());
}
// If $message is false, mod_rewrite is enabled.
// Otherwise, it is not and we need to:
// 1) disable the form field
// 2) make sure the config value is set to 0
// 3) append the message to the return
$value = ($mod_rewrite === false) ? 0 : $value;
$message = $mod_rewrite === null ? 'MOD_REWRITE_INFORMATION_UNAVAILABLE' : ($mod_rewrite === false ? 'MOD_REWRITE_DISABLED' : false);
// Let's do some friendly HTML injection if we want to disable the
// form field because h_radio() has no pretty way of doing so
$field_name = 'config[enable_mod_rewrite]' . ($message === 'MOD_REWRITE_DISABLED' ? '" disabled="disabled' : '');
return h_radio($field_name, array(1 => 'YES', 0 => 'NO'), $value) .
($message !== false ? '<br /><span>' . $user->lang($message) . '</span>' : '');
}
} }

View file

@ -5733,6 +5733,7 @@ function phpbb_create_symfony_request(phpbb_request $request)
*/ */
function phpbb_get_web_root_path(Request $symfony_request, $phpbb_root_path = '') function phpbb_get_web_root_path(Request $symfony_request, $phpbb_root_path = '')
{ {
global $config, $phpEx, $request;
static $path; static $path;
if (null !== $path) if (null !== $path)
{ {
@ -5748,9 +5749,8 @@ function phpbb_get_web_root_path(Request $symfony_request, $phpbb_root_path = ''
$corrections = substr_count($path_info, '/'); $corrections = substr_count($path_info, '/');
// When URL Rewriting is enabled, app.php is optional. We have to // We need to account for whether or not app.php is in the URL
// correct for it not being there if (strpos($symfony_request->server->get('REQUEST_URI', ''), 'app.' . $phpEx) !== false)
if (strpos($symfony_request->getRequestUri(), $symfony_request->getScriptName()) === false)
{ {
$corrections -= 1; $corrections -= 1;
} }

View file

@ -101,6 +101,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_function_nam
INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_max_chunk_size', '50'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_max_chunk_size', '50');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_package_size', '20'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_package_size', '20');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_confirm', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_confirm', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_mod_rewrite', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_pm_icons', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_pm_icons', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_post_confirm', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_post_confirm', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('feed_enable', '1'); INSERT INTO phpbb_config (config_name, config_value) VALUES ('feed_enable', '1');

View file

@ -427,6 +427,10 @@ $lang = array_merge($lang, array(
'FORCE_SERVER_VARS_EXPLAIN' => 'If set to yes the server settings defined here will be used in favour of the automatically determined values.', 'FORCE_SERVER_VARS_EXPLAIN' => 'If set to yes the server settings defined here will be used in favour of the automatically determined values.',
'ICONS_PATH' => 'Post icons storage path', 'ICONS_PATH' => 'Post icons storage path',
'ICONS_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/icons</samp>.', 'ICONS_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/icons</samp>.',
'MOD_REWRITE_ENABLE' => 'Enable URL Rewriting',
'MOD_REWRITE_ENABLE_EXPLAIN' => 'When disabled, URL paths will include app.php. When enabled, URL paths will not include app.php.<br /><strong>This option requires the Apache module <samp>mod_rewrite</samp> to be enabled and the appropriate rewrite rules must be present in <samp>.htaccess</samp>.</strong>',
'MOD_REWRITE_DISABLED' => 'The <samp>mod_rewrite</samp> module on your Apache web server is disabled. Enable the module or contact your web hosting provider if you wish to enable this feature.',
'MOD_REWRITE_INFORMATION_UNAVAILABLE' => 'We are unable to determine whether or not this server supports URL rewriting. This setting may be enabled but if URL rewriting is not available, paths generated by this board (such as for use in links) may be broken. Contact your web hosting provider if you are unsure whether or not you can safely enable this feature.',
'PATH_SETTINGS' => 'Path settings', 'PATH_SETTINGS' => 'Path settings',
'RANKS_PATH' => 'Rank image storage path', 'RANKS_PATH' => 'Rank image storage path',
'RANKS_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/ranks</samp>.', 'RANKS_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/ranks</samp>.',

View file

@ -36,10 +36,10 @@ class phpbb_controller_helper
protected $user; protected $user;
/** /**
* Request object * config object
* @var phpbb_request * @var phpbb_config
*/ */
protected $request; protected $config;
/** /**
* phpBB root path * phpBB root path
@ -61,11 +61,11 @@ class phpbb_controller_helper
* @param string $phpbb_root_path phpBB root path * @param string $phpbb_root_path phpBB root path
* @param string $php_ext PHP extension * @param string $php_ext PHP extension
*/ */
public function __construct(phpbb_template $template, phpbb_user $user, phpbb_request_interface $request, $phpbb_root_path, $php_ext) public function __construct(phpbb_template $template, phpbb_user $user, phpbb_config $config, $phpbb_root_path, $php_ext)
{ {
$this->template = $template; $this->template = $template;
$this->user = $user; $this->user = $user;
$this->request = $request; $this->config = $config;
$this->phpbb_root_path = $phpbb_root_path; $this->phpbb_root_path = $phpbb_root_path;
$this->php_ext = $php_ext; $this->php_ext = $php_ext;
} }
@ -109,14 +109,12 @@ class phpbb_controller_helper
$route = substr($route, 0, $route_delim); $route = substr($route, 0, $route_delim);
} }
$request_uri = $this->request->variable('REQUEST_URI', '', false, phpbb_request::SERVER); // If enable_mod_rewrite is false, we not need to include app.php
$script_name = $this->request->variable('SCRIPT_NAME', '', false, phpbb_request::SERVER);
// If the app.php file is being used (no rewrite) keep it in the URL.
// Otherwise, don't include it.
$route_prefix = $this->phpbb_root_path; $route_prefix = $this->phpbb_root_path;
$parts = explode('/', $script_name); if (empty($this->config['enable_mod_rewrite']))
$route_prefix .= strpos($request_uri, $script_name) === 0 ? array_pop($parts) . '/' : ''; {
$route_prefix .= 'app.' . $this->php_ext . '/';
}
return append_sid($route_prefix . "$route" . $route_params, $params, $is_amp, $session_id); return append_sid($route_prefix . "$route" . $route_params, $params, $is_amp, $session_id);
} }

View file

@ -0,0 +1,25 @@
<?php
/**
*
* @package migration
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License v2
*
*/
class phpbb_db_migration_data_310_mod_rewrite extends phpbb_db_migration
{
static public function depends_on()
{
return array(
'phpbb_db_migration_data_310_dev',
);
}
public function update_data()
{
return array(
array('config.add', array('enable_mod_rewrite', '0')),
);
}
}

View file

@ -15,28 +15,28 @@ class phpbb_controller_helper_url_test extends phpbb_test_case
public function helper_url_data() public function helper_url_data()
{ {
return array( return array(
array('foo/bar?t=1&amp;f=2', false, true, false, 'foo/bar?t=1&amp;f=2', 'parameters in url-argument'), array('foo/bar?t=1&amp;f=2', false, true, false, 'app.php/foo/bar?t=1&amp;f=2', 'parameters in url-argument'),
array('foo/bar', 't=1&amp;f=2', true, false, 'foo/bar?t=1&amp;f=2', 'parameters in params-argument using amp'), array('foo/bar', 't=1&amp;f=2', true, false, 'app.php/foo/bar?t=1&amp;f=2', 'parameters in params-argument using amp'),
array('foo/bar', 't=1&f=2', false, false, 'foo/bar?t=1&f=2', 'parameters in params-argument using &'), array('foo/bar', 't=1&f=2', false, false, 'app.php/foo/bar?t=1&f=2', 'parameters in params-argument using &'),
array('foo/bar', array('t' => 1, 'f' => 2), true, false, 'foo/bar?t=1&amp;f=2', 'parameters in params-argument as array'), array('foo/bar', array('t' => 1, 'f' => 2), true, false, 'app.php/foo/bar?t=1&amp;f=2', 'parameters in params-argument as array'),
// Custom sid parameter // Custom sid parameter
array('foo/bar', 't=1&amp;f=2', true, 'custom-sid', 'foo/bar?t=1&amp;f=2&amp;sid=custom-sid', 'using session_id'), array('foo/bar', 't=1&amp;f=2', true, 'custom-sid', 'app.php/foo/bar?t=1&amp;f=2&amp;sid=custom-sid', 'using session_id'),
// Testing anchors // Testing anchors
array('foo/bar?t=1&amp;f=2#anchor', false, true, false, 'foo/bar?t=1&amp;f=2#anchor', 'anchor in url-argument'), array('foo/bar?t=1&amp;f=2#anchor', false, true, false, 'app.php/foo/bar?t=1&amp;f=2#anchor', 'anchor in url-argument'),
array('foo/bar', 't=1&amp;f=2#anchor', true, false, 'foo/bar?t=1&amp;f=2#anchor', 'anchor in params-argument'), array('foo/bar', 't=1&amp;f=2#anchor', true, false, 'app.php/foo/bar?t=1&amp;f=2#anchor', 'anchor in params-argument'),
array('foo/bar', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, false, 'foo/bar?t=1&amp;f=2#anchor', 'anchor in params-argument (array)'), array('foo/bar', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, false, 'app.php/foo/bar?t=1&amp;f=2#anchor', 'anchor in params-argument (array)'),
// Anchors and custom sid // Anchors and custom sid
array('foo/bar?t=1&amp;f=2#anchor', false, true, 'custom-sid', 'foo/bar?t=1&amp;f=2&amp;sid=custom-sid#anchor', 'anchor in url-argument using session_id'), array('foo/bar?t=1&amp;f=2#anchor', false, true, 'custom-sid', 'app.php/foo/bar?t=1&amp;f=2&amp;sid=custom-sid#anchor', 'anchor in url-argument using session_id'),
array('foo/bar', 't=1&amp;f=2#anchor', true, 'custom-sid', 'foo/bar?t=1&amp;f=2&amp;sid=custom-sid#anchor', 'anchor in params-argument using session_id'), array('foo/bar', 't=1&amp;f=2#anchor', true, 'custom-sid', 'app.php/foo/bar?t=1&amp;f=2&amp;sid=custom-sid#anchor', 'anchor in params-argument using session_id'),
array('foo/bar', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, 'custom-sid', 'foo/bar?t=1&amp;f=2&amp;sid=custom-sid#anchor', 'anchor in params-argument (array) using session_id'), array('foo/bar', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, 'custom-sid', 'app.php/foo/bar?t=1&amp;f=2&amp;sid=custom-sid#anchor', 'anchor in params-argument (array) using session_id'),
// Empty parameters should not append the &amp; // Empty parameters should not append the &amp;
array('foo/bar', false, true, false, 'foo/bar', 'no params using bool false'), array('foo/bar', false, true, false, 'app.php/foo/bar', 'no params using bool false'),
array('foo/bar', '', true, false, 'foo/bar', 'no params using empty string'), array('foo/bar', '', true, false, 'app.php/foo/bar', 'no params using empty string'),
array('foo/bar', array(), true, false, 'foo/bar', 'no params using empty array'), array('foo/bar', array(), true, false, 'app.php/foo/bar', 'no params using empty array'),
); );
} }
@ -51,9 +51,9 @@ class phpbb_controller_helper_url_test extends phpbb_test_case
$this->user = $this->getMock('phpbb_user'); $this->user = $this->getMock('phpbb_user');
$this->template = new phpbb_template_twig($phpbb_root_path, $phpEx, $config, $this->user, new phpbb_template_context()); $this->template = new phpbb_template_twig($phpbb_root_path, $phpEx, $config, $this->user, new phpbb_template_context());
// We don't use mod_rewrite in tests
$request = new phpbb_mock_request($_GET, $_POST, $_COOKIE, $_SERVER, false, $_FILES); $config = new phpbb_config(array('enable_mod_rewrite' => '0'));
$helper = new phpbb_controller_helper($this->template, $this->user, $request, '', 'php'); $helper = new phpbb_controller_helper($this->template, $this->user, $config, '', 'php');
$this->assertEquals($helper->url($route, $params, $is_amp, $session_id), $expected); $this->assertEquals($helper->url($route, $params, $is_amp, $session_id), $expected);
} }
} }