访问目录时出现mod_rewrite问题

时间:2011-12-21 10:32:54

标签: 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并设置了虚拟主机。 在我的index.php中,有代码可以传递页面并检查它是否存在(在数据库中)。如果没有,则显示错误消息。它工作正常。

例如:http://mysite/contactus/

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

就像那样,如果我转到用于存储javascript文件的js文件夹,就会出现上述问题。因此,如果将任何子目录的名称作为页面名称传递,则会导致问题。

如何解决这个问题?

提供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]

修改 新代码(半工作):

RewriteEngine on
RewriteBase /

# remove trailing slash ONLY if it is not an existing folder
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1/ [R,L]

RewriteRule ^article/([a-z]+)/?$  http://%{HTTP_HOST}/index.php?page=article&name=$1 [L]
RewriteRule ^([a-z]+)/?$ http://%{HTTP_HOST}/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

我很困惑。

3 个答案:

答案 0 :(得分:0)

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

你必须把斜线放在前面。


编辑:改变了?到*

答案 1 :(得分:0)

我的理解是您的脚本仅用于文档,而不是图像或其他资源。

然后你应该马上忽略它们。请尝试在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]

然后会立即提供这些子目录,从而绕过下一个RewriteRule集。

答案 2 :(得分:0)

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

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