Mod Rewrite无法正常工作

时间:2013-03-29 22:58:49

标签: apache .htaccess mod-rewrite

我编写了一个简单的mod重写脚本,将website.com/index.php?var1=1&var2=2&var3=3转换为website.com/index/1/2/3。出于某种原因,它不起作用,任何想法为什么?

#RewriteRule ^$ index.php [QSA]
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1\.php [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php/$1 [QSA]

RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$ comments.php?var1=$1&var2=$2&var3=$3

3 个答案:

答案 0 :(得分:1)

  • 第一条规则将index/1/2/3重写为index/1/2/3.php
  • 然后第二条规则将其重写为index.php/index/1/2/3.php
  • 最后一条规则不匹配。

如果要将website.com/index.php?var1=1&var2=2&var3=3重写为website.com/index/1/2/3,则必须使用RewriteCond捕获查询字符串参数并将其插入RewriteRule

RewriteEngine on
RewriteCond %{QUERY_STRING} var1=(.*?)&var2=(.*?)&var3=(.*?)
RewriteRule ^index.php$ /index/%1/%2/%3 [L]

如果您想重定向而不是内部重写,即在浏览器中显示新网址,请使用[R,L]作为RewriteRule标记

RewriteRule ^index.php$ /index/%1/%2/%3 [R,L]

答案 1 :(得分:0)

看起来第6行的重写会捕获并将其发送到index.php。很难说不知道文件和目录是什么东西,但我猜它不是。如果您可以访问httpd.conf,则可以打开重写日志记录,设置

RewriteLogLevel 8

它会记录远远超出调试所需的信息。在较新版本的apache上,使用LogLevel设置设置,例如..

LogLevel alert rewrite:trace8

可以在vhosts或htaccess中允许,因此请在您的版本的文档中查找。

不要将其打开,因为它会严重影响性能。

答案 2 :(得分:0)

我不知道你问题中的规则有什么问题,但要实现这个目标:

  

website.com/index.php?var1=1&var2=2&var3=3变为website.com/index/1/2/3

在根目录下的.htaccess文件中需要这样的内容:

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !\.php  [NC]
RewriteCond %{REQUEST_URI} ^/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?   [NC]
RewriteRule .*                 /%1.php?var1=%2&var2=%3&var3=%4 [L,NC]

静默地映射:

http://website.com/filename/1/2/3

要:

http://website.com/filename.php?var1=1&var2=2&var3=3

filename 1 2 3 是动态字符串。

对于永久重定向,将[L,NC]替换为[R = 301,L,NC]。