我编写了一个简单的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
答案 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]。