我的代码:
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
我很困惑。
答案 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]