在apache重写规则中使用模式开头的反向引用

时间:2015-02-20 23:15:40

标签: php apache mod-rewrite url-rewriting rewrite

我目前正在将网站从英语翻译成西班牙语。我想使用一个重写规则,可以将当前语言放在url的开头,就在域之后。例如:

当前网址没有重写规则: http://www.example.com/sample_subdirectory/?language=spanish

目标: http://www.example.com/spanish/sample_subdirectory/

在撰写本文时,我将所有的php文件重写为好像是子目录(例如example.com/something.php到example.com/something/),所以没有问题。我的目标是看看是否有办法重写网址,以便显示“/ spanish / something / something_else / etc /”而不是显示语言GET变量。目标是不必为每个URL仅针对西班牙语翻译执行单独的重写规则,而是将/ spanish /子目录附加到url的开头。我试图找出如何使用元字符,但我不认为我做得对。这是我试过的(我很确定这样做错了:/)

RewriteCond%{QUERY_STRING} ^ id =(西班牙语)$ RewriteRule ^ / spanish /(.*)$ / $ 1?id =%1

我仍然对重写规则有点新意,我只知道基本的东西,我绝对不是网络服务器管理员所以我不知道如何实现我的目标。希望有可能做到这一点。具有讽刺意味的是,我可能已经完成了简单的重写规则,而不是花费一个小时试图做到这一点但是很好:P

2 个答案:

答案 0 :(得分:0)

根据您在上面给出的示例,以下内容应该符合您的要求:

RewriteCond %{QUERY_STRING} ^language=spanish$
RewriteRule ^/(.*)$ /spanish/%1?

只有当查询字符串为“language = spanish”时,RewriteCond才会运行RewriteRule。

RewriteRule保存原始URL中的目录,并将其附加到目录“/ spanish /”。的?最后删除查询字符串。

答案 1 :(得分:0)

感谢bobdye的洞察力,我意识到我必须完全删除这个条件并调整RewriteRule看起来像这样:

RewriteRule ^/subdirectory/spanish/(.*)$ /subdirectory/$1?language=spanish

注意:/ subdirectory是我在笔记本电脑上运行的虚拟服务器(localhost)内的文件夹。

正如你所看到的,我不得不将/ spanish /目录放在模式中,并且我将使用的任何子目录作为实际链接的后向引用,然后我只是将GET变量language = spanish附加到链接的结尾。我仍然需要测试以确保这适用于/ spanish /下的任意数量的副标题,但这肯定解决了我的问题。