在我目前的项目中,我有几个目录:应用程序(我的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的内容。
而且,我真的很想了解这一点。为什么你的答案有效?为什么我的尝试失败了?
答案 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
希望这有帮助。