2014-09-23 5 views
0

Я пытаюсь выяснить, как изменить файл .htaccess, так что я могу сделать две вещи:Apache + PHP без «.php» File Extension, но в том числе Path Info

  1. не должны включать. расширение php на моих PHP-файлах (например, запрос my.domain.com/page соответствует my.domain.com/page.php).
  2. Сделайте # 1, включая дополнительную информацию о пути (например, запрос my.domain.com/page/path/stuff/here соответствует my.domain.com/page.php/path/stuff/here).

Я узнал, как сделать # 1, добавив следующую строку в файл .htaccess:

# Allow PHP files without ".php" extension. 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/.]+)/?$ /$1.php [L,QSA] 

Однако, сейчас я хотел бы изменить RewriteRule так работает # 2 ,

ответ

0

Вы можете просто попытаться использовать Multiviews, которая сделана, чтобы сделать именно это:

Options +Multiviews 
0
RewriteEngine On # Turn on the rewriting engine 
RewriteRule ^([^\.]+)$ $1.php [NC,L] #Remove the .php 

Не уверен, что вы хотите с Pathing вещи, хотя.

Редактировать на основе вашего комментария, я использовал что-то подобное с php/angular. Вероятно, это не «правильный» или лучший способ сделать это, но это сработало для меня.

Htaccess

RewriteEngine  on 
# Allow the API to function as a Front Controller 
RewriteRule   ^api/(.*)$ api/index.php?rt=$1 [L,QSA,NC] 
# Allow Angular to have Pretty URL's 
RewriteCond   %{REQUEST_FILENAME} !-f 
RewriteCond   %{REQUEST_FILENAME} !-d 

апи/index.php

// Pull the routing path 
$router = explode('/', $_GET['rt']); 

$version = $router[0]; 
$controller = $router[1]; 
$action = $router[2]; 

// Check for the file 
if(file_exists($version . '/controllers/' . $controller .'.class.php')) { 
    include $version . '/controllers/' . $controller .'.class.php'; 
} else { 
    return false; 
} 

// Initialize and execute 
$method = new $controller($action); 
print $method->$action(); 

Это позволяет мне сделать что-то вроде: апи/v1/пользователей/входа в URL, то будет найти users.class.php в папке V1 и запустить функцию login.

+0

Это то же самое, что и у OP, кроме 'NC, L'. Всегда добавляйте объяснения к своему ответу (что означает 'NC, L'?). – DanFromGermany

+0

Вид, но не совсем. Regex's разные. Также: [L = Last] (http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_l) [NC = nocase] (http://httpd.apache.org/docs/2.2/ переписывание/flags.html # flag_nc). – jassok

+1

К сожалению, это не так. Но, чтобы ответить на вопрос jassok, это способ сделать HTTP-запрос более конкретным. Вы можете захватить данные из pathinfo, чтобы точно определить, какую функцию выполнять, и, следовательно, какие данные вы ожидаете в строке запроса или данных формы, и какой контент должен возвращаться. Таким образом, вы можете написать один контроллер для нескольких связанных запросов. –

0

OK, после поиска MultiViews, я нашел несколько статей предупреждение против них (а, каждому свое), но это также привело меня к ответу, который использует 2 правила, а не только 1:

RewriteRule ^([^\.]+)$ /$1.php [L] 
RewriteRule ^([^\./]+)/(.*) /$1.php/$2 [L] 

Первое правило ловит случай № 1 выше, а второе правило ловит случай № 2 выше. Вуаля!