Как передать запросы, не идущие в определенные каталоги, к index.php / path? - PullRequest
2 голосов
/ 16 июня 2009

В моем нынешнем проекте у меня есть несколько каталогов: application (мои файлы MVC, к которым нельзя обращаться), images, css и js. По сути, я хочу, чтобы все запросы к images / css / js выполнялись без изменений, но все остальные, которые я хочу назвать index.php/my/path.

Мой .htaccess в настоящее время выглядит следующим образом и наносит ущерб моей маршрутизации.

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond $1 !^(index\.php|images|js|css|robots\.txt)
  RewriteRule ^(.*)$ http://example.com/index.php/$1 [L]
</IfModule>

Это не работает, так как относительные URL-адреса начинают складываться, например: example.com/blog/view/1/blog/view/2.

Когда я пытаюсь что-то вроде, -

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{REQUEST_URI} !^/(index\.php|images|js|css|robots\.txt)
  RewriteRule ^ index.php%{REQUEST_URI} [PT]
</IfModule>

Я получаю эту ошибку при любом запросе: No input file specified.


Как заставить все запросы не в мои каталоги из белого списка вызывать, а не перенаправлять (отправка сообщений об убийствах с помощью перенаправления, я обнаружил), index.php/path? IE, когда браузер запрашивает /blog/view/1, .htaccess вызывает index.php/blog/view/1. Справочные файлы на сайте Apache не слишком ясны о том, как делать такие вещи - или, я просто упускаю смысл того, что я читаю о RewriteRule.

И я действительно хочу это понять. Почему ваш ответ сработает? Почему мои попытки проваливаются?

Ответы [ 4 ]

3 голосов
/ 16 июня 2009

Это то, что у меня есть в моем .htaccess для моей платформы:

<IfModule mod_rewrite.c>
    RewriteEngine on

    #This will stop processing if it's images
    RewriteRule \.(css|jpe?g|gif|png|js)$ - [L] 

    #Redirect everything to apache
    #If the requested filename isn’t a file….
    RewriteCond %{REQUEST_FILENAME} !-f
    #and it isn’t a folder…
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule ^(.*)$ index.php?$1 [L,QSA] 
    #L = (last - stop processing rules)
    #QSA = (append query string from requeste to substring URL)
</IfModule>

Надеюсь, это поможет.

PS: Может быть, вы хотите удалить строки, чтобы прекратить перенаправление, если это файл или папка;)

2 голосов
/ 16 июня 2009

Антонио помог мне встать на правильный путь, поэтому вот результат .htaccess:

<IfModule mod_rewrite.c>
  RewriteEngine on
  # skip if whitelisted directory
  RewriteRule ^(images|css|js|robots\.txt|index\.php) - [L]
  # rewrite everything else to index.php/uri
  RewriteRule . index.php%{ENV:REQUEST_URI} [NE,L]
</IfModule>
0 голосов
/ 04 октября 2011

Это то, что я использую в моем .htaccess файле для моей CMS:

Options -Indexes

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php/$1 [NC,L]

А потом в моем index.php файле у меня есть:

$path_info = '';
$path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : $path_info;
$path_info = isset($_SERVER['ORIG_PATH_INFO']) ? $_SERVER['ORIG_PATH_INFO'] : $path_info;

$request = explode('/', trim($path_info, '/'));

// if $request[0] is set, it's the controller
// if $request[1] is set, it's the action
// all other $request indexes are parameters

Надеюсь, это поможет.

0 голосов
/ 16 июня 2009

Вам придется сделать это с помощью PHP. Например, если вы хотите разделить ваш URI на что-то вроде domain.tld / controller / action / param, то вы можете использовать следующий код PHP в качестве начала:

<?php

// Filter URI data from full path
$uri_string = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']);
$uri_string = trim($uri_string, '/');    // Make sure we don't get empty array elements

// Retrieve URI data
$uri_data = explode('/', $uri_string);

В этом случае $ uri_data [0] - это контроллер, $ uri_data [1] - это действие, а за ним - параметры. Обратите внимание, что это не надежный метод, и никогда не стоит доверять введенному пользователем вводу, как этот, поэтому вы должны внести в белый список те контроллеры и действия, которые можно использовать.

Отсюда, зная контроллер и имея непротиворечивую структуру каталогов, вы можете потребовать_консульта соответствующего контроллера и вызвать действие, используя переменные переменные.

...