Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Вы можете по существу сделать это двумя способами:
Добавьте файл с именем .htaccess
в корневую папку и добавьте что-то вроде этого:
RewriteEngine on
RewriteRule ^/?Some-text-goes-here/([0-9]+)$ /picture.php?id=$1
Это скажет Apache, чтобы включить mod_rewrite для этой папки, и если ему будет задан URL-адрес, соответствующий регулярному выражению, он переписывает его внутренне на то, что вы хотите, без конца пользователь посмотрев. Легко, но негибко, поэтому, если вам нужно больше энергии:
Вместо этого вместо этого введите вместо этого .htaccess: (обратите внимание на ведущую косую черту)
FallbackResource /index.php
Это скажет, чтобы он запускал ваш index.php
для всех файлов, которые он обычно не может найти на вашем сайте. Там вы можете, например:
$path = ltrim($_SERVER['REQUEST_URI'], '/'); // Trim leading slash(es)
$elements = explode('/', $path); // Split path on slashes
if(empty($elements[0])) { // No path elements means home
ShowHomepage();
} else switch(array_shift($elements)) // Pop off first item and switch
{
case 'Some-text-goes-here':
ShowPicture($elements); // passes rest of parameters to internal function
break;
case 'more':
...
default:
header('HTTP/1.1 404 Not Found');
Show404Error();
}
Это то, как это делают большие сайты и CMS-системы, поскольку это позволяет гораздо большую гибкость в анализе URL-адресов, конфигурационных и зависимых от базы данных URL-адресов и т. Д. Для спорадического использования жестко закодированные правила перезаписи в .htaccess
сделают все возможное.
Хотя уже ответили, и автор намерен создать приложение типа front controller, но я отправляю буквальное правило для заданной проблемы. если у кого-то проблема такая же.
RewriteEngine On
RewriteRule ^([^/]+)/([^/]+)/([\d]+)$ $1?id=$3 [L]
Выше должно работать для url picture.php/Some-text-goes-here/51
. без использования index.php в качестве приложения для перенаправления.
Если вы хотите изменить маршрут для picture.php
, то добавление правила перезаписи в .htaccess
будет служить вашим потребностям, но если вы хотите переписать URL-адрес, как в Wordpress, то PHP является способом. Вот простой пример для начала.
Структура папки
В корневой папке .htaccess
и index.php
есть два файла, и было бы хорошо поместите остальные файлы .php
в отдельную папку, например inc/
.
root/
inc/
.htaccess
index.php
.htaccess
RewriteEngine On
RewriteRule ^inc/.*$ index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
Этот файл имеет четыре директивы:
RewriteEngine
- включить механизм перезаписи RewriteRule
- запретить доступ ко всем файлам в папке inc/
, перенаправить любой вызов в эту папку на index.php
RewriteCond
- разрешить прямой доступ ко всем другим файлам (например, изображения, css или скрипты) RewriteRule
- перенаправить что-либо еще на index.php
index.php
Поскольку все теперь перенаправлено на index.php, будет определено, правильно ли указатель, все параметры присутствуют, и если тип параметров правильный.
Чтобы проверить URL-адрес, нам нужно иметь набор правил, и лучшим инструментом для этого является регулярное выражение. Используя регулярные выражения, мы ударим двух мух одним ударом. Url, чтобы пройти этот тест, должны иметь все необходимые параметры, которые проверяются на допустимых символах. Вот несколько примеров правил.
$rules = array(
'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51'
'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug'
'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug'
'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact'
'post' => "/(?'post'[\w\-]+)", // '/post-slug'
'home' => "/" // '/'
);
Далее следует подготовить запрос uri.
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
Теперь, когда у нас есть запрос uri, последний шаг - проверить uri по правилам регулярного выражения.
foreach ( $rules as $action => $rule ) {
if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
/* now you know the action and parameters so you can
* include appropriate template file ( or proceed in some other way )
*/
}
}
Успешное совпадение будет, поскольку мы используем именованные подшаблоны в регулярном выражении, заполняем массив $params
почти так же, как PHP заполняет массив $_GET
. Однако при использовании динамического url массив $_GET
заполняется без каких-либо проверок параметров.
/picture/some+text/51 Array ( [0] => /picture/some text/51 [text] => some text [1] => some text [id] => 51 [2] => 51 ) picture.php?text=some+text&id=51 Array ( [text] => some text [id] => 51 )
Эти несколько строк кода и базовое знание регулярных выражений достаточно, чтобы начать строить сплошной система маршрутизации.
Полный источник
define( 'INCLUDE_DIR', dirname( __FILE__ ) . '/inc/' );
$rules = array(
'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51'
'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug'
'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug'
'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact'
'post' => "/(?'post'[\w\-]+)", // '/post-slug'
'home' => "/" // '/'
);
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
foreach ( $rules as $action => $rule ) {
if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
/* now you know the action and parameters so you can
* include appropriate template file ( or proceed in some other way )
*/
include( INCLUDE_DIR . $action . '.php' );
// exit to avoid the 404 message
exit();
}
}
// nothing is found so handle the 404 error
include( INCLUDE_DIR . '404.php' );
это файл .htaccess, который пересылает почти все в index.php
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_URI} !-l
RewriteCond %{REQUEST_FILENAME} !\.(ico|css|png|jpg|gif|js)$ [NC]
# otherwise forward it to index.php
RewriteRule . index.php
, а затем вы разбираете $ _SERVER ["REQUEST_URI"] и отправляетесь на picture.php или что угодно
FallbackResource
несколько основных версий назад, которая теперь является предпочтительным способом реализации этого поведения с более низкой производительностью, так как не требуется запускать весь механизм перезаписи. Документация здесь . Ваши правила также ошибочны, потому что вы не ссылаетесь на каталоги (!-d
), и все фильтры расширений устарели - -f
уже должны их улавливать.
– Niels Keurentjes
5 May 2013 в 22:03
PHP не то, что вы ищете, посмотрите mod_rewrite
picture.php/invalid-text/51
также будет перенаправлен в одно и то же место. Вы также можете добавить проверку, чтобы убедиться, что строка верна, а если нет, перенаправлять снова в правильное место. Так я сделал это на одном из моих сайтов, используя htaccess. – Mike 5 May 2013 в 22:09/blog/25
, а также/picture/51
и/download/684
. Кроме того, это считается очень плохой практикой (и вы получаете наказание в Google PR!), Если не все случайно сгенерированные URL-адреса должным образом возвращают 404. – Niels Keurentjes 5 May 2013 в 22:12FallbackResource /index.php
(обратите внимание на ведущую косую черту) – Jack James 31 January 2014 в 16:46FallbackResource
используется только для файлов, которые фактически не существуют в файловой системе, следовательно, fallback i>. Поэтому, если у вас есть файл/static/styles.css
и ссылайтесь на него какhttp://mydomain.tld/static/styles.css
, код никогда не выполняется, что делает его работу как ожидалось и предназначалось прозрачно. – Niels Keurentjes 15 June 2014 в 11:56