带有查询字符串i18n的mod_rewrite url

时间:2013-11-12 22:45:08

标签: apache mod-rewrite

<ul>
   <a href="?lang=pt"><li class="pt lang"></li></a>
   <a href="?lang=en"><li class="us lang"></li></a>
</ul>

如果我有这样的网址:

http://mywebsite/site/?lang=en

使用纯mod_rewrite解决方案,我该如何转录为这种格式?

http://mywebsite/en/site/ Or http://mywebsite/site/en/

我正在尝试这个,但显然不起作用。

RewriteRule ^/(\w+)/?$ ?lang=$1  

更多详细信息:我正在使用此类生成i18n令牌。

https://github.com/Philipp15b/php-i18n


此类尝试通过生成以下内容的队列来查找用户语言:

    Forced language (if set)
    GET parameter 'lang' ($_GET['lang'])
    SESSION parameter 'lang' ($_SESSION['lang'])
    HTTP_ACCEPT_LANGUAGE (can be multiple languages) ($_SERVER['HTTP_ACCEPT_LANGUAGE'])
    Fallback language

基本上,我想要的是一个友好的网址,但是使用这个课程。

3 个答案:

答案 0 :(得分:0)

RewriteRule ^/(\w+)(/.*) $2?lang=$1 [QSA]

答案 1 :(得分:0)

尝试:

RewriteEngine On

RewriteCond %{THE_REQUEST} \ /(.*)\?lang=([a-z]{2})
RewriteRule ^/?(.*)$ /%1/$1? [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([a-z]{2})/(.*)$ /$2?lang=$1 [L,QSA]

答案 2 :(得分:0)

这会将请求uri从/site/en转换为/site/?lang=en

RewriteRule ^(/[^/]+/?)(.*) $1?lang=$2 [L,QSA]

如果您想要首先使用您可以尝试的语言:

RewriteRule ^/([^/]+)/(.*) /$2/?lang=$1 [L,QSA]

这会将请求uri从/en/site...转换为/site.../?lang=en

我在使用apache 2.2的vhost中尝试过这些重写。

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   ServerName www.test.org

  DocumentRoot /var/web/
  <Directory /var/web/>
      Options -Indexes FollowSymLinks MultiViews
      AllowOverride None
      Order allow,deny
      allow from all
  </Directory>

  ErrorLog /var/log/apache2/www.test.org_error.log

  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn

  CustomLog /var/log/apache2/www.test.org_access.log combined

  RewriteEngine On
  RewriteLogLevel 8  # set to 0 in production
  RewriteLog /var/log/apache2/www.test.org_rewrite.log

  RewriteRule ^(/[^/]+/?)(.*) $1?lang=$2 [L,QSA]

</VirtualHost>

在rewrite.log中我看到:

(2) init rewrite engine with requested uri /site/en
(3) applying pattern '^(/[^/]+/?)(.*)' to uri '/site/en'
(2) rewrite '/site/en' -> '/site/?lang=en'

请注意重写日志:永远不要在生产环境中启用它。