MVC htaccess rewrite

3

你好,我在自己的MVC中遇到了htaccess配置问题。我不知道哪里出错了?一直显示500错误:

服务器内部错误

服务器遇到了内部错误或配置错误,无法完成您的请求。

请联系服务器管理员admin@localhost,并告知发生错误的时间以及可能导致错误的任何操作。

有关此错误的更多信息可能会在服务器错误日志中提供。

我想将URL重写到索引页。 尝试像这样做:

www.example.com/index.php/controller/method/param

www.example.com/index.php?url=controler

我的.htaccess看起来像这样:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l 

RewriteRule ^(.+) index.php?url=$l [QSA,L]

我做错了什么?我阅读了http://httpd.apache.org/docs/current/rewrite/flags.html上的内容并按照那里面的说明进行操作。

"关于此错误的更多信息可能会在服务器错误日志中提供。" - 所以去看看那里写了什么。 - Quentin
@Quentin,希望他也在手册中看到了这一点。 “最后,在继续之前,请确保使用LogLevel指令将mod_rewrite的日志级别配置为跟踪级别之一。尽管这可能会提供大量信息,但在调试与mod_rewrite配置相关的问题时是不可或缺的,因为它会告诉您每个规则的处理方式。” https://httpd.apache.org/docs/2.4/rewrite/intro.html - Anthony Rutledge
在源URL中已经有index.php,这很奇怪。我认为重写MVC的URL的想法是将URL从http://www.example.com/controller/method/foo/bar/baz/buz/翻译成一般形式的替换,即http://www.example.com/index.php?c=controller&m=method&p=/foo/bar/baz/buz/。或者更简单地说,http://www.example.com/index.php?path=/controller/method/foo/bar/baz/buz/ - Anthony Rutledge
4个回答

4
<IfModule mod_rewrite.c>    
    Options +FollowSymLinks
    RewriteEngine On

    RewriteCond %{REQUEST_URI} !-f
    RewriteCond %{REQUEST_URI} !-d
    RewriteCond %{REQUEST_URI} !-l
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

这个应该能正常工作。
http://www.mysite.com/stats

=>

http://www.mysite.com/index.php?url=stats

好的,这个代码可以工作,但是看起来有问题。当我在index.php中输入测试变量:$url = $_GET['url']; echo $url; 这只能在index.php?url=test上工作。当我尝试index.php/test/other时,它会给我“注意:未定义索引$url”。为什么呢? - Ivan
注意,"%{REQUEST_URI} !-l" 适用于 Apache 2.2。在 Apache 2.4 中,请使用 "%{REQUEST_URI} !-L"。 - Anthony Rutledge

2

您的最后一行有错误:

RewriteRule ^(.+) index.php?url=$l [QSA,L]

应该是:

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

换句话说,将 $l(字母el)更改为 $1(数字1)。此外,您可能希望在括号后面添加 $ 以关闭该行。

我知道这很常见,但我想知道为什么在替换中经常使用 url,实际上 $1 不是 URL,而是路径组件。 - Anthony Rutledge

2
尝试这个:

试试这个:

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?url=$1 [L]
</IfModule>

1
请检查以下配置指令,如果您的 .htaccess 隐藏文件位于主根目录中:
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^index\.php/([a-zA-Z0-9_-]+)/method/param$ /index.php?url=$1 [QSA,L]

它会将 www.example.com/index.php/$var/method/param 重写为 www.example.com/index.php?url=$var,但请确保您的 .htaccess 文件位于主根目录中。

当下划线不是有效的URL字符时,怎么会有下划线呢?他最好做一些像(.+)这样的事情,而不是试图指定一个特定的字符类。 - Anthony Rutledge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接