.htaccess RewriteRule为URL添加驱动器路径

时间:2011-04-25 13:14:02

标签: apache .htaccess mod-rewrite apache2

我在Win7机器上使用安装在C:上的Zend Server CE(v.5.1.0)。我添加了一个项目到 httpd.conf

Alias /project "D:\Homepages\project"
<Directory "D:\Homepages\project">
    Options Indexes FollowSymLinks
    AllowOverride all
    Order allow,deny
    Allow from all
</Directory>

project 目录中的 .htaccess 文件包含以下内容:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} ^/\w*\.(css|js) [NC]
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

现在问题;如果我去

  

http://localhost/project/index.php

一切似乎都运转良好。我到达 index.php 文件并获取我的内容。 但是,如果我转到任何其他会触发RewriteRule的页面,它似乎是添加目录路径。 FireFox输出以下未找到消息:

  

在此服务器上找不到请求的URL /Homepages/project/index.php。

我试图在这里找到类似的问题/答案,但失败了。任何的想法? PS。我接受答案的时间可能会延迟,因为我会在差事上待一段时间。

2 个答案:

答案 0 :(得分:5)

您需要设置RewriteBase指令;否则,mod_rewrite会自动执行,默认情况下会将文件路径添加到生成的重写规则中。

来自:http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

  

当新URL发生替换时,此模块必须将URL重新注入服务器处理。为了能够做到这一点,它需要知道相应的URL前缀或URL基是什么。默认情况下,此前缀是相应的文件路径本身。但是,对于大多数网站而言,URL与物理文件名路径没有直接关系,因此这种假设通常是错误的!因此,您可以使用RewriteBase指令指定正确的URL前缀。   如果您的Web服务器的URL与物理文件路径没有直接关系,则需要在要使用RewriteRule指令的每个.htaccess文件中使用RewriteBase。

答案 1 :(得分:1)

你的最后一行是这样的:

RewriteRule ^.*$ /index.php [NC,L]

但是我认为这是无限循环,所以我建议改为:

RewriteCond %{THE_REQUEST} !\s/index.php [NC]
RewriteCond %{REQUEST_URI} !^/index.php [NC]
RewriteRule . /index.php [L]

如果已经是/index.php,则会阻止转到index.php。