2013-03-29 104 views
0

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

#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 

回答

0

它看起来像第6行的重写将捕获并发送到index.php。很难说不知道什么是文件和目录,但我猜测它不是。如果你有机会获得你可以调高改写记录的httpd.conf中,设置

RewriteLogLevel 8 

而且比你需要调试这个它会记录更多的信息。在Apache的较新版本的设置被设定为LogLevel的e.g ..

LogLevel alert rewrite:trace8 

可以在虚拟主机或htaccess的允许所以看它在你的版本的文档。

不要放弃这一点,因为它会严重影响性能。

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=3website.com/index/1/2/3,你必须捕捉查询字符串参数与RewriteCond并将其插入到一个RewriteRule

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

如果要重定向而不是内部重写,即显示在浏览器中新的URL,使用[R,L]作为重写规则标志

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

+1这实际上回答了“为什么不这样做”的问题。 –

1

我不知道什么是概率不LEM与你的问题的规则,但要实现这一点:

website.com/index.php?var1=1&var2=2&var3=3website.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

凡文件名,,,和是动态的字符串。

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