regex - htaccess 外部重写/内部重定向

标签 regex apache .htaccess mod-rewrite

我想用 .htaccess 文件实现两件事。
第一个是

www.hostname.com/index.php?question  -> www.hostname.com/question
www.hostname.com/index.php?myinfo  -> www.hostname.com/myinfo
www.hostname.com/index.php?notification  -> www.hostname.com/notification

所以我使用外部重写来重新表达 URL,如下所示。
RewriteCond %{THE_REQUEST} /(index.php)\?([^&]+)\ HTTP
RewriteRule ^ /%2? [R=301,L]

现在上面的语句正确显示为我想要的。问题是在满足条件时内部转换回来。条件是如果 %{THE_REQUEST}等于 ' / 之后的任何字符'。
RewriteCond %{REQUEST_URI} ^/(.*)$ [NC]
RewriteRule ^(.*)$ index.php?$1 [NC,L]

这样我的 php 代码就可以识别 $_GET范围。在这里,即使满足条件,它也不会处理 RewriteRule。

第二个问题是
www.hostname.com/index.php?category=spo  -> www.hostname.com/category/spo
www.hostname.com/index.php?category=ite  -> www.hostname.com/category/ite
www.hostname.com/index.php?category=gam  -> www.hostname.com/category/gam

使用外部重写完成转换:
RewriteCond %{THE_REQUEST} /(index)\?category=([^&]+)\ HTTP
RewriteRule ^ category/%2? [R=301,L]

同样,我想在内部将 URL 中写入的任何内容转换回原始格式,因此我使用以下条件来区分前一种情况,
RewriteCond %{REQUEST_URI} ^/category/(.*)$
RewriteRule ^category/(.*)/?$ index.php?category=$1 [NC,L]

我的 php 代码无法识别 $_GET参数和变量。当我使用 htacces 测试器时,它说它应该可以工作,但它没有。 http://martinmelin.se/rewrite-rule-tester/

我该如何解决这个问题?或者有没有更简单的方法来实现这一点?

谢谢

最佳答案

试试这些规则:

RewriteEngine On

RewriteCond %{THE_REQUEST} \s/index\.php\?category=([^&\s]+) [NC]
RewriteRule ^ /category/%1? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^category/([^/]+)/?$ /index.php?category=$1 [NC,L,QSA]

RewriteCond %{THE_REQUEST} \s/index\.php\?([^&\s]+) [NC]
RewriteRule ^ /%1? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ /index.php?$1 [QSA,L]

关于regex - htaccess 外部重写/内部重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21210606/

相关文章:

没有文件扩展名的正则表达式匹配 url

linux - 一个一般的 linux 文件权限问题 : Apache and WordPress

Java Pattern.matcher(StringBuffer),为什么它的行为与 Pattern.matcher(String) 不同?

javascript - 在 JavaScript 中使用 REGEX 分割字符串

php - cURL 加载时间过长

apache - 我怎样才能有条件的 .htaccess block ?

.htaccess - 重写基本: from specific url to another specific url

.htaccess - 用.htaccess替换URL的一部分

Javascript:使用 <b> 标记突出显示字符串的一部分

php - docker PHP-APACHE "You don' t 有权访问/在此服务器上”