.htaccess重写规则php get参数

.htaccess重写规则php get参数,php,regex,apache,.htaccess,mod-rewrite,Php,Regex,Apache,.htaccess,Mod Rewrite,我试图实现url重定向到我的网站,但我有问题,让它正常工作。。我读了这些文件,做了大量的研究,所以我相信我现在可以寻求帮助了 我得到的最接近正则表达式的命令是 (/\?page=)(.*) matches ?page=about !(/\?page=) matches everything but /?page= 我想是吧 我想要的结果是: domain.com/?page=home -> domain.com/home domain.com/?page=about -> doma

我试图实现url重定向到我的网站,但我有问题,让它正常工作。。我读了这些文件,做了大量的研究,所以我相信我现在可以寻求帮助了

我得到的最接近正则表达式的命令是

(/\?page=)(.*) matches ?page=about
!(/\?page=) matches everything but /?page=
我想是吧

我想要的结果是:

domain.com/?page=home -> domain.com/home
domain.com/?page=about -> domain.com/about
domain.com/?page=contact -> domain.com/contact
domain.com/?page=guestbook -> domain.com/guestbook
我尝试过很多不同的东西,但老实说,我甚至连最简单的东西都做不到。至少我已经设法将访问者重定向到www.domain.com,这是一个进步,不幸的是,我在网上找到了这方面的代码,而不是我自己编写的

需要重写吗

我是说。。我甚至不明白为什么下面的这些都不起作用,所以请启发我,解释我做错了什么,以及我如何着手解决我的问题

RewriteEngine On
RewriteCond \/(\?page=)
RewriteRule (\/\?page=)(.*) \/\?page=contact

首先告诉htaccess您希望尊重真实的文件和目录

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteBase /
然后使用如下规则

RewriteRule ^home$ index.php?page=home&%{QUERY_STRING} [L]
RewriteRule ^about$ index.php?page=about&%{QUERY_STRING} [L]
等等


&%{QUERY_STRING}仅当您最终打算传递其他url参数时,例如/about?lag=en

在这里,测试了这一点,并且似乎对我有效:

RewriteEngine On

#Redirect the url if loaded with page=A or B or C (testing values)
RewriteCond %{QUERY_STRING} page=(A|B|C) [NC]
RewriteRule (.*) /%1/? [R=301,L]

#might not be needed if you already have a solution for this
#rewrite the url to index if the file doesn't exist.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php?q=$1 [L,QSA]

您可以在文档\u ROOT/.htaccess文件中使用此代码:


我已经有一段时间没有这样做了,但我相信查询字符串不是规则中url的一部分。您需要在一个条件中检查%{QUERY_STRING}。首先,这与OP请求的是反向的。从问题:domain.com/?page=home->domain.com/home,或者换句话说,用户正在加载page=home的url,OP希望重定向到/home。其次,RewriteCond仅适用于下一次规则运行。你不能设置一些条件并将它们应用于所有规则。假设你对他的问题的理解可能比我的好。使用RewriteCond%{QUERY_STRING}page=home | about | C[NC]RewriteRule./%1/?[R=301,L]它按照我想要的方式重写了url,但是,它没有按照我预期的方式工作,这可能是我的误解,但我希望不是。。。我相信它试图在domain.com/A上列出它不允许列出的文件夹,因此它向我显示了一个错误页面/代码404。所以这就好像url重写也影响了真实的url,我认为它不会这样做?还有,谢谢你的邀请help@MarcusEkström你是说你想重定向,而不是重写。他们是不同的。重定向实际上告诉用户页面不在此处,请在[此处插入新路径]处发出另一个请求。重写说明用户在服务器上请求了XYZ,但我们有一条规则,即当用户发出请求时加载ABC页面,然后告诉用户我们找到了页面,页面在这里,并给了他们ABC。因此,我上面发布的代码执行重定向,而不是重写。如果你不想重定向,最好在php中进行此更改,而不是.htaccess.Oh。你完全正确,这是我的业余错误,我道歉。我确实想重写,而不是重定向。虽然用PHP来做,这不是很多余吗?
RewriteEngine On
RewriteBase /

# external redirect from actual URL to pretty one
RewriteCond %{THE_REQUEST} /(?:index\.php)?\?page=([^\s&]+) [NC]
RewriteRule ^ %1? [R=302,L,NE]

# internal forward from pretty URL to actual one
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ ?page=$1 [L,QSA]