Я хочу переписать свой url http://oxfordmobilevalet.co.uk/?page=services http://oxfordmobilevalet.co.uk/services в htacces [duplicate]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

114
задан GraphicsMuncher 2 August 2015 в 23:11
поделиться

5 ответов

Вы можете по существу сделать это двумя способами:

Маршрут .htaccess с mod_rewrite

Добавьте файл с именем .htaccess в корневую папку и добавьте что-то вроде этого:

RewriteEngine on
RewriteRule ^/?Some-text-goes-here/([0-9]+)$ /picture.php?id=$1

Это скажет Apache, чтобы включить mod_rewrite для этой папки, и если ему будет задан URL-адрес, соответствующий регулярному выражению, он переписывает его внутренне на то, что вы хотите, без конца пользователь посмотрев. Легко, но негибко, поэтому, если вам нужно больше энергии:

Маршрут PHP

Вместо этого вместо этого введите вместо этого .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 сделают все возможное.

164
ответ дан Sebastian Støttrup 17 August 2018 в 14:26
поделиться
  • 1
    Вместо жесткого кодирования, вы можете просто использовать регулярное выражение, чтобы полностью игнорировать строку. Другими словами, единственное, что имеет значение, это идентификационная часть. Переход на picture.php/invalid-text/51 также будет перенаправлен в одно и то же место. Вы также можете добавить проверку, чтобы убедиться, что строка верна, а если нет, перенаправлять снова в правильное место. Так я сделал это на одном из моих сайтов, используя htaccess. – Mike 5 May 2013 в 22:09
  • 2
    Удобно для небольших сайтов, но не очень практично, если вам нужно проанализировать /blog/25, а также /picture/51 и /download/684. Кроме того, это считается очень плохой практикой (и вы получаете наказание в Google PR!), Если не все случайно сгенерированные URL-адреса должным образом возвращают 404. – Niels Keurentjes 5 May 2013 в 22:12
  • 3
    по крайней мере, в моей системе, это было FallbackResource /index.php (обратите внимание на ведущую косую черту) – Jack James 31 January 2014 в 16:46
  • 4
    @olli: комментарий о плохой практике конкретно относится к «не возвращению 404 для несуществующих URL-адресов», который решается решением в самом ответе. Что касается первого вопроса - FallbackResource используется только для файлов, которые фактически не существуют в файловой системе, следовательно, fallback . Поэтому, если у вас есть файл /static/styles.css и ссылайтесь на него как http://mydomain.tld/static/styles.css, код никогда не выполняется, что делает его работу как ожидалось и предназначалось прозрачно. – Niels Keurentjes 15 June 2014 в 11:56
  • 5

Хотя уже ответили, и автор намерен создать приложение типа front controller, но я отправляю буквальное правило для заданной проблемы. если у кого-то проблема такая же.

RewriteEngine On
RewriteRule ^([^/]+)/([^/]+)/([\d]+)$ $1?id=$3 [L]

Выше должно работать для url picture.php/Some-text-goes-here/51. без использования index.php в качестве приложения для перенаправления.

1
ответ дан Abhishek Gurjar 17 August 2018 в 14:26
поделиться

Если вы хотите изменить маршрут для 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]

Этот файл имеет четыре директивы:

  1. RewriteEngine - включить механизм перезаписи
  2. RewriteRule - запретить доступ ко всем файлам в папке inc/, перенаправить любой вызов в эту папку на index.php
  3. RewriteCond - разрешить прямой доступ ко всем другим файлам (например, изображения, css или скрипты)
  4. 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' );
48
ответ дан Danijel 17 August 2018 в 14:26
поделиться
  • 1
    Как вы читаете параметры? Он не работает с $ post_id = htmlentities ($ _ GET ['post']); – andrebruton 20 June 2014 в 07:52
  • 2
    спасибо, это мне очень помогает. – Muhammad Sufiyan 31 March 2015 в 15:54
  • 3
    @Danijel Могу ли я иметь полный исходный код? Я пробовал код выше, но был выведен только текст, а CSS - никакого эффекта. Спасибо. – 4 Leave Cover 28 August 2017 в 17:21

это файл .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 или что угодно

5
ответ дан Luca Rocchi 17 August 2018 в 14:26
поделиться
  • 1
    Apache представила директиву FallbackResource несколько основных версий назад, которая теперь является предпочтительным способом реализации этого поведения с более низкой производительностью, так как не требуется запускать весь механизм перезаписи. Документация здесь . Ваши правила также ошибочны, потому что вы не ссылаетесь на каталоги (!-d), и все фильтры расширений устарели - -f уже должны их улавливать. – Niels Keurentjes 5 May 2013 в 22:03

PHP не то, что вы ищете, посмотрите mod_rewrite

3
ответ дан rauchmelder 17 August 2018 в 14:26
поделиться
  • 1
    повлияет ли он на все URL-адреса? – Jazerix 5 May 2013 в 21:50
  • 2
    @Jazerix Это зависит от правил, которые вы определяете. – nietonfir 5 May 2013 в 21:51
  • 3
    Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - Из обзора – mmvsbg 12 March 2018 в 09:05
Другие вопросы по тегам:

Похожие вопросы: