更新:底部的解决方案。
我最近使用index.php?p=page_name&o=temporary_override
这样的设置切换到/page_name/temporary_override
等干净的网址。临时覆盖只是因为我可以在构建时看到网站更改的结果。
我目前将mod_rewrite设置为:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]
将捕获“子目录”,然后PHP解析GHPAGE $ _GET var中的URL。我想要的是设置301重定向,以便任何人使用index.php?p = something& o = something_else将被重定向到/ something / something_else。知道我怎么能做到这一点? p& o可能以任何顺序出现,其中一个或另一个可能不存在。
编辑:好的,在@ Jon-Lin,@ dambrisco和@anubhava的帮助下,我已经接近了。我的.htaccess文件现在看起来像:RewriteEngine On
#Base Directory
RewriteBase /test/
#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^index\.php$ /%4/%5 [R=301,L]
#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^index\.php$ /%4 [R=301,L]
#Remove index.php
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*index\.php\ HTTP\/
RewriteRule ^index\.php$ / [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]
它现在正在重定向,但并不是它需要去的地方。 root/test/index.php?p=test&o=override
现在重定向到root/test/override?p=test&o=override
。更近,但我无法弄清楚如何摆脱正在添加到URL的GET变量,或者为什么它重定向到根目录而不是重定向到RewriteBase目录。
编辑:
它现在正确地重定向,但由于某种原因,它正在从等式中删除/ test / RewriteBase文件夹。 http://www.domain.com/test/index.php?p=page1&o=operation
被重定向到http://www.domain.com/page1/operation
。新的.htaccess文件如下:
RewriteEngine On
RewriteBase /test/
#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^ /%4/%5? [R=301,L]
#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^ /%4? [R=301,L]
#if index.php
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*index\.php\ HTTP\/
RewriteRule ^index\.php$ /$ [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]
谢谢大家。问题已经解决了。最终.htaccess在下面供参考。
RewriteEngine On
RewriteBase /test/
#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^ %4/%5? [R=301,L]
#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^ %4? [R=301,L]
#if index.php
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*index\.php\ HTTP\/
RewriteRule ^index\.php$ ? [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?GHPAGE=$1 [L,QSA]
答案 0 :(得分:0)
在你的htaccess中添加它:
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /index\.php\?p=([^&]+)&o=(.+)\ HTTP
RewriteRule index.php /%2/%3 [R=301,L]
如果您想要覆盖没有“temporary_override”的情况,请同时添加:
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /index\.php\?p=(.+)\ HTTP
RewriteRule index.php /%2 [R=301,L]
更接近,但我无法弄清楚如何摆脱正在添加到URL的GET变量或者为什么它重定向到根目录而不是重定向到RewriteBase目录
在?
的末尾添加/%4/%5
以删除查询字符串。并从/
中删除前导/%4/%5
,以防止重写到根目录。因此,例如,您的一条规则应如下所示:
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ \/([^\/]+\/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^index\.php$ %4/%5? [R=301,L]
答案 1 :(得分:0)
您将要使用以下内容:
RewriteRule ^([^/]+)/?$ index.php?p=$1 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?p=$1&o=$2 [L,QSA]
这样,example.com/page_name
内部传递给index.php?p=page_name
,example.com/page_name/operation
传递给index.php?p=page_name&o=operation
。 Jon Lin的回答似乎正好相反,我昨晚没有注意到。
除了避免与你可能拥有的其他规则发生冲突外,不应该有任何RewriteConds,只是为了澄清。
答案 2 :(得分:0)
更改2条RewriteRule行应以?
结尾,如下所示:
#if 2 GET Vars
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=([^&]+)&[op]=(.+)\ HTTP\/
RewriteRule ^ /%4/%5? [R=301,L]
#if 1 GET Var
RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /([^/]+/)*(index\.php)?\?[op]=(.+)\ HTTP\/
RewriteRule ^ /%4? [R=301,L]