Php 通过htaccess搜索引擎优化友好链接-将动态链接重定向到静态链接

Php 通过htaccess搜索引擎优化友好链接-将动态链接重定向到静态链接,php,regex,.htaccess,mod-rewrite,redirect,Php,Regex,.htaccess,Mod Rewrite,Redirect,我有一个网站,我想切换到搜索引擎优化友好的链接。为了节省一些工作,我想通过htaccess进行重定向,以便旧的动态链接如下: mydomain.com/mypage.php?id=1&something=2 将重定向到更友好的: mydomain.com/mypage/1/2/ 据我所知,我需要这些重定向,这样搜索引擎就不会因为重复的内容而惩罚我,因为我需要这样做,所以我认为只做它们可能会更容易,而不是将每个页面上的链接更改为友好的链接-我使用的是普通的html表单,所以不会很直接。

我有一个网站,我想切换到搜索引擎优化友好的链接。为了节省一些工作,我想通过htaccess进行重定向,以便旧的动态链接如下:

mydomain.com/mypage.php?id=1&something=2
将重定向到更友好的:

mydomain.com/mypage/1/2/
据我所知,我需要这些重定向,这样搜索引擎就不会因为重复的内容而惩罚我,因为我需要这样做,所以我认为只做它们可能会更容易,而不是将每个页面上的链接更改为友好的链接-我使用的是普通的html表单,所以不会很直接。 我正试图通过htaccess中的代码来实现这一点:

Options +FollowSymlinks
RewriteEngine On

RewriteBase /directory for mydomain.com/

RewriteRule ^mypage\.php?id=([0-9]+)&something=([0-9]+)$ ^mypage/$1/$2 [R=302,QSA]
RewriteRule ^mypage/([0-9]+)/([0-9]+)/?$ ^mypage.php?id=$1&something=$2  [QSA]
但它不起作用。我认为一个问题可能是“?”在:

我可能错了,但通过多次测试,我得出结论,我不能使用?在那里做标记,但不知道如何解决它


请提供帮助。

您无法匹配
重写规则中的查询字符串。正确的处理方法是在
DocumentRoot/.htaccess
文件中使用以下规则:

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /test_redirects/

# external redirect from actual URL to pretty one
RewriteCond %{THE_REQUEST} \s/test_redirects/([^.]+)\.php\?id=([^\s&]+)&something=([^\s&]+) [NC]
RewriteRule ^ %1/%2/%3? [R=302,L]

# internal forward from pretty URL to actual one
RewriteRule ^([^/]+)/([0-9]+)/([^/]+)/?$ $1.php?id=$2&something=$3 [L,QSA]

嗨,谢谢你的快速回答。我尝试了你的代码,它将url重写为seo友好型,但页面没有打开-服务器上找不到404请求页面错误。这是否意味着我没有读第二条规则?当你得到404时,你在浏览器中看到的页面URL是什么?重写的那个。在这个例子中,它应该是:mydomain.com/mypage/1/2,但我使用了一个url指向旧的:mydomain.com/mypage.php?id=1&something=2。我再次测试了这些规则,它们工作正常。要测试注释,请在
#external redirect
行下方的2行,然后在浏览器中输入
mydomain.com/mypage/1/2
。我已经检查了它,我想我现在知道问题出在哪里了。重定向后,存储页面的文件夹将被写入两次。可能是我的错,正如我写的,我想在mydomain.com中使用它,但对于测试,我有一个类似于mydomain.com/test\u redirects/的文件夹,其中存储了文件和htaccess。在重定向之后,现在我们有:mydomain.com/test_redirects/test_redirects/1/2很抱歉混淆了,但是您能告诉我如何更改,以便公式也能在子文件夹中工作吗
Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /test_redirects/

# external redirect from actual URL to pretty one
RewriteCond %{THE_REQUEST} \s/test_redirects/([^.]+)\.php\?id=([^\s&]+)&something=([^\s&]+) [NC]
RewriteRule ^ %1/%2/%3? [R=302,L]

# internal forward from pretty URL to actual one
RewriteRule ^([^/]+)/([0-9]+)/([^/]+)/?$ $1.php?id=$2&something=$3 [L,QSA]