我正在尝试重写一些简单的网址:
http://www.site.com/folder/index.php?page=something
到
http://www.site.com/folder/something
这是我的.htaccess文件(放在/ folder /中)
RewriteEngine On
RewriteBase /folder
RewriteRule ^(.*)$ index.php?page=$1 [R]
使用此规则我总是会得到此网址
http://www.site.com/folder/index.php?page=index.php
我做错了什么?
答案 0 :(得分:2)
首先,改变
RewriteBase /folder
到
RewriteBase /folder/
其次,改变
RewriteRule ^(.*)$ index.php?page=$1 [R]
到
RewriteRule ^index\.php/(.*)$ index.php?page=$1 [L,QSA]
那应该有用。 QSA 部分是允许地址中的任何查询字符串转移到新地址;否则,他们将被丢弃。
在这种情况下,试试这个
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
类似于你之前的情况。
除非你有其他模式,否则应该达到你需要的目的
希望它有所帮助。
答案 1 :(得分:1)
您正在引用错误的匹配,请使用 $2
,如此
RewriteEngine On
RewriteBase /folder
RewriteRule ^(.*)$ index.php?page=$2 [R]
上述情况实际上是错误的。似乎.
与正确的字符不匹配(我不知道为什么)。
在不知道问题原因的情况下,我能看到最好的方法是简单地匹配字母和数字,如下所示:
# Turn on the rewrite engine
RewriteEngine On
# Set the rewrites for /folder
RewriteBase /folder
# Set the rewrite rules
RewriteRule ^([a-z0-9]+)/?$ index.php?page=$1 [NC]
答案 2 :(得分:0)
您的初始规则运作良好。唯一的问题是[R]修饰符重定向 /文件夹/某些东西到/folder/index.php?page=something并导致第二次请求。
在/folder/index.php?page=something上应用你的规则,你得到/folder/index.php?page=index.php
要修复此替换[R](HTTP 302重定向)[L](在此处匹配时保留匹配链)并且您已完成
答案 3 :(得分:0)
感谢大家,我成功地做了我想做的事情:
RewriteEngine On
RewriteBase /folder/
#Excluding direct url to php files
RewriteCond %{REQUEST_URI} !(.*)\.php$
#Excluding the empty space url
RewriteCond %{REQUEST_URI} !^(\s*)$
RewriteCond %{REQUEST_URI} !\.(gif|jpg|png|css|js|)$ [NC]
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
答案 4 :(得分:-1)
如果我建议,请查看htaccess的生成器,例如:http://www.generateit.net/mod-rewrite/
给你:
RewriteEngine On
RewriteRule ^folder/([^/]*)$ /folder/index.php?page=$1 [L]
我编写了上述内容,这是本地testdomain上的一个工作示例。 也许这就是你一直在寻找的东西。
另外,如果可以的话,不建议省略页面的扩展名。谷歌喜欢它是可识别的,例如.html或.php。
并且,您应该为添加的每个参数添加一个重写。
最后,我会省略index.php。如果没有找到其他页面,您的服务器将自动加载index.php,但它不必在地址栏中可见。