Php 访问目录时mod_重写出现问题

Php 访问目录时mod_重写出现问题,php,apache,mod-rewrite,Php,Apache,Mod Rewrite,我的代码: RewriteEngine on RewriteBase / RewriteRule ^article/([a-z]+)/?$ index.php?page=article&name=$1 [L] RewriteRule ^([a-z]+)/?$ index.php?page=$1 [L] 我正在使用WAMP并设置了一个虚拟主机。 在my index.php中,有一些代码可以让页面通过并检查它是否存在(在数据库中)。如果不是,则显示错误消息。它很好用 例如:http://m

我的代码:

RewriteEngine on
RewriteBase /
RewriteRule ^article/([a-z]+)/?$ index.php?page=article&name=$1 [L]
RewriteRule ^([a-z]+)/?$ index.php?page=$1 [L]
我正在使用WAMP并设置了一个虚拟主机。 在my index.php中,有一些代码可以让页面通过并检查它是否存在(在数据库中)。如果不是,则显示错误消息。它很好用

例如:
http://mysite/contactus/

但是如果我在URL中使用目录名作为页面名称,它将不起作用。例如:
http://mysite/images/
。这将显示页面未找到错误(即检查数据库,未找到页面,因此显示“未找到”)。但它不会在页面中显示图像、css(链接文件)。此外,它还显示
http://mysite/images/?page=images
在地址栏中

这样,如果我转到用于存储javascript文件的
js
文件夹,就会出现上述问题。所以,若将任何子目录的名称作为pagename传递,就会产生问题

如何解决这个问题

http://mysite/images/
已提供,mod_rewrite正在重定向到
http://mysite/images/index.php?page=images
而不是
http://mysite/index.php?page=images

编辑 请告诉我如何阻止文件和目录的热链接,并重定向回索引页或发送一些浏览器标题错误

我试过这个:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*) http://%{HTTP_HOST} [R,L]
RewriteRule ^article/([a-z]+)/?$ /index.php?page=article&name=$1 [L]
RewriteRule ^([a-z]+)/?$ /index.php?page=$1 [L]
编辑 新代码(半工作):

这段代码将解决在提到目录名时不显示pics和css的问题。但无论我指定什么页面名,例如:
http://mysite/contactus
,它将转到URL:
http://mysite/index.php?page=contactus
。即使我使用目录名,例如:
http://mysite/js
,它将转到:
http://mysite/index.php?page=js

我很困惑

RewriteEngine on
RewriteBase /
RewriteRule ^article/([a-z]+)/?$ index.php?page=article&name=$1 [L]
RewriteRule ^([a-z]+)/*$ /index.php?page=$1 [L]
你必须把斜线放在前面



编辑:更改了吗?我的理解是,您的脚本仅用于文档,而不是图像或其他资源

那么你应该马上忽略它们。尝试在
RewriteBase
之后添加此行,如下所示:

RewriteEngine on
RewriteBase /rewrite/
RewriteRule ^/(images|js)/(.*)$ - [L]
RewriteRule ^article/([a-z]+)/?$ index.php?page=article&name=$1 [L]
RewriteRule ^([a-z]+)/?$ index.php?page=$1 [L]

然后这些子目录将立即被服务,从而绕过下一个
重写规则集。

对于目录的问题,我通常强制使用斜杠

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^\.]+[^/])$    $1/ [R]

非常感谢。这将解决
http://mysite/images/?page=images
问题。现在它将只显示
http://mysite/images/
。但是图像仍然没有显示出来。另外,如果我把,
http://mysite/images
(末尾没有斜杠),它仍将显示
http://mysite/images/?page=images
是。我也试过“*”。静止图像(html内部)不显示。但是
http://mysite/images/?page=images
问题已针对
http://mysite/images/
。不适用于
http://mysite/images
(结尾没有斜杠)@VppMan:也许你应该写([a-z]+)\/*,也许擒纵装置问题我不希望允许热链接或目录列表。因此,我必须包含防止这种情况的代码,它将解决我目前的问题?当您删除/它是否匹配图像时会发生什么?它不起作用。另外,我不想硬编码目录名,因为会有更多的目录。@Vpp-Man:但它确实适用于您的规则集,我在自己的服务器上进行了检查。为了清楚起见,请参阅我编辑的答案。如果你不想硬编码任何名字,我可以理解。
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^\.]+[^/])$    $1/ [R]