如何将不进入特定目录的请求传递给index.php / path?

时间:2009-06-16 14:23:56

标签: .htaccess mod-rewrite

在我目前的项目中,我有几个目录:应用程序(我的MVC文件,不得访问),图像,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>

当相对网址开始堆叠时,这不起作用,例如: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 个答案:

答案 0 :(得分:3)

这就是我在我的.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:如果它是文件或文件夹,也许你想要删除那些停止重定向的行;)

答案 1 :(得分:2)

安东尼奥帮助我走上正轨,所以这就是.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>

答案 2 :(得分:0)

你将不得不使用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]是动作,除此之外是参数。请注意,这不是一个万无一失的方法,并且如此信任用户输入的输入绝对不是一个好主意,因此您应该将那些可以使用的控制器和操作列入白名单。

从这里,了解控制器并具有一致的目录结构,您可以require_once正确的控制器并使用变量变量调用该操作。

答案 3 :(得分:0)

这是我在CMS的.htaccess文件中使用的内容:

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

希望这有帮助。