我正在使用自定义MVC PHP框架,索引页面(充当路由器)接收GET变量“do”,其中包含将路由到的路径。如果未设置此变量,则默认为Auth控制器,方法登录。
require_once('config.php');
$controllerAction = isset($_GET['do'])?$_GET['do']:"auth/login";
require_once('core/main.php');
然后索引页面(上面的源代码)将此$ controllerAction传递给main.php文件,该文件自动加载主控制器,然后加载请求的控制器。
因此,此框架中的URI的格式为mysite.com/?do=controller/method/variable,我需要它的格式为mysite.com/controller/method/variable。
这是我尝试使用的.htaccess文件,它只是不起作用(我有其他htaccess文件在同一台服务器上运行所以它不是Apache问题):(
RewriteEngine On
RewriteRule ^([^/]*)$ /?do=$1 [L]
有人建议我可以使用PHP来做到这一点,但我不知道该怎么做。
编辑: 错误是我得到“此页面无法显示”,404错误,每当我尝试直接访问mysite.com/controller/method链接而不是默认的mysite.com?do=controller/method
进一步编辑
(请注意其他虚拟主机在我的localhost上运行正常):
(XAMPP)Apache虚拟主机信息:
<VirtualHost *:80>
DocumentRoot "D:\sites\mysite.com\root\wwwroot"
ServerName mysite.com
ServerAlias mysite.com
<Directory "D:\sites\mysite.com\root\wwwroot">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
文件结构(Windows):
D:\
--sites
----mysite.com
--------@client_details
--------root
-----------@devfiles
-----------@vars_pwd
-----------wwwroot
--------------config
--------------core
--------------application
------------------controllers
------------------libraries
------------------models
------------------views
----------------------css
----------------------javascript
----------------------images
----------------------icons
答案 0 :(得分:4)
首先,您的.htaccess
内容存在一些问题。如果存在具有所请求名称的文件,则不重写是一个好主意。这允许您为图像或任何其他静态内容(如css文件,javascript,下载等)设置img/
文件夹。第一个RewriteCond
告诉Apache只有在没有此名称的文件夹存在时才重写。第二个对文件做同样的事情。然后你可能想要QSA(即查询字符串追加)选项,它会将所有其他GET
变量传递给你的脚本。
在这种情况下,您可以简化正则表达式并使用它:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?do=$1 [L,QSA]
您可能会感到惊讶,因为这与其他人发布的内容大致相同。我为我的许多项目使用类似的东西,我刚刚测试过它,我可以保证它的工作原理。你的apache配置肯定有问题。
当您遇到mod_rewrite
问题时,首先应该尝试启用模块本身。在shell中以root身份键入以下命令:
a2enmod rewrite
/etc/init.d/apache2 restart
第一个激活模块(如果一切正常,则向Module rewrite already enabled
投诉),第二个重启Apache服务器。当然,您的服务器上的路径可能不同。
然后你必须确保你的VHost配置允许你使用.htaccess
文件并重写。这意味着AllowOverride
必须设置为至少FileInfo
(或All
)。您还可以尝试将重写规则放入配置文件中。您的配置应该与此类似:
<VirtualHost *:*>
ServerName test.example.com
ServerAlias www.test.example.com
DocumentRoot /home/sites/test/
<Directory "/home/sites/test/">
Allow from all
AllowOverride All
Options +Indexes
</Directory>
</VirtualHost>
请注意,如果更改了Apache中的任何内容,则必须重新启动Apache。
如果这一切都无济于事,那么查看错误日志总是一个好主意。在我的系统中,它们位于/var/log/apache2/error.log
(debian)。他们可能会为您提供有关出错的更多信息。
答案 1 :(得分:2)
尝试
RewriteEngine On
RewriteRule ^([^/]*)$ index.php?do=$1 [L]
答案 2 :(得分:2)
尝试
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?do=$1 [L]
答案 3 :(得分:2)
检查您的apache日志,具体访问日志。如果文件夹存在于Web根目录中,那么您应该可以直接访问它:)。您可能还想检查是否有相同站点的重复虚拟主机条目。
答案 4 :(得分:2)
这是我定制的MVC框架,它基于cake
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?do=$1 [QSA,L]
</IfModule>
可能这应该有所帮助。此site.com/controller/method
的典型网址格式答案 5 :(得分:1)
我不知道您的域名设置是什么,但这里有一些建议。
如果您的代码位于文件夹的根目录中,并且索引文件名为index.php,请尝试以下操作:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?do=$1 [L,QSA]
如果您的网站存在于子文件夹中,例如www.example.com/site/,索引文件是index.php然后尝试以下操作(将/ site /更改为您的文件夹)。
RewriteEngine On
RewriteBase /site/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /site/index.php?do=$1 [L,QSA]
如果仍然收到404错误消息,请执行以下操作:
修改:只是阅读您的说明,我注意到您说网址应该基本上类似于mysite.com/?do=controller/method/variable
。如果它对这种格式非常严格,那么你还需要输入删除任何前导或尾部斜杠的规则,例如:以下重写规则应该这样做:
RewriteRule ^\?(.*)\?$ /index.php?do=$1 [L,QSA]
(这使得前导和尾部斜杠可选,但它应该从你传递的实际值中删除它们。)