重写多个URL';s使用.htaccess


Rewriting multiple URL's with .htaccess

我需要一些帮助来为我的网站重写不同的URL。这是一个多语言网站,所以它有点复杂。我设法把一些事情做好了。到目前为止,我的代码就是这样做的:

  • 定义RewriteBase(因为localhost和生产服务器有不同的基础)
  • 将www.mysite.com重写为www.mysite.com/en/(或其他语言,具体取决于"lang"参数)
  • 将非www重定向到www
  • 从URL中删除index.php

我想要什么

但我对代码有两个问题:

  • 它重定向到http://www.example.com/en/?lang=en.但我不想要最后一个参数,我无法用我的基本技能找出如何隐藏"lang"。如何防止将该参数添加到URL
  • 当我去的时候,比方说,http://www.example.com/?page=news/en/不会添加到URL中。如何解决?它应该总是在每个url中,在域之后添加语言

除此之外,我希望有两个额外的重写器,但我不希望我的htaccess一团糟。所以我希望有人能给我指明正确的方向。在我的htaccess中,最好的方法是什么?

  • 参数"page"包含正在显示并且应该重写的页面:http://www.example.com/en/index.php?page=info->http://www.example.com/en/info/(我已经想好了如何隐藏index.php,请参阅下面的代码)

  • 我的新闻页面(http://www.example.com/en/index.php?page=news&id=2452&news=lorem ipsum)应该重写为http://www.example.com/en/news/2452/lorem-ipsum/.

对于所有这些规则:URL应该以/结尾,如果没有,它应该添加它:所以http://www.example.com/en/news->http://www.example.com/en/news/.

这是我现在的代码:

Options +FollowSymlinks 
RewriteEngine On
RewriteBase /
# SET REWRITEBASE VARIABLE
RewriteCond %{HTTP_HOST} !=localhost
RewriteRule ^ - [E=FRB:/]
RewriteCond %{HTTP_HOST} =localhost
RewriteRule ^ - [E=FRB:/www.example.com/]

## REWRITE FOR LANGUAGE ##
# empty url -> redirect to en/
RewriteCond %{QUERY_STRING} !lang=(en|de)
RewriteRule ^$ %{ENV:FRB}en/ [R=301,L]
# url is ONLY '/en' or '/de' -> redirect to /en/ or /de/ (adding slash)
RewriteRule ^(en|nl)$  %{ENV:FRB}$1/ [R=301,L]
# now all urls have en/ de/ -> parse them
RewriteRule ^(en|nl)/(.*)$  %{ENV:FRB}$2?lang=$1&%{query_STRING} [L]

## REWRITE NON-WWW TO WWW (EXCEPT ON LOCALHOST) ##
RewriteEngine On
RewriteCond %{HTTP_HOST} !=localhost
RewriteCond %{HTTP_HOST} !^(.*)'.example'.com$ [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

## REMOVE INDEX.PHP FROM URL ##
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L,QSA]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}'s(.*)/index'.php [NC]
RewriteRule ^ %1 [R=301,L]

非常感谢你帮我!如果你有问题,请告诉我。

这样做:

Options +FollowSymlinks 
RewriteEngine On
# SET REWRITEBASE VARIABLE
RewriteCond %{HTTP_HOST} !=localhost
RewriteRule ^ - [E=FRB:/]
RewriteCond %{HTTP_HOST} =localhost
RewriteRule ^ - [E=FRB:/www.example.com/]
## REWRITE FOR LANGUAGE ##
# empty url -> redirect to en/
RewriteCond %{QUERY_STRING} !lang=(en|de)
RewriteRule ^$ %{ENV:FRB}en/ [R=301,L]
## REMOVE INDEX.PHP FROM URL ##
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}'s(.*)/index'.php [NC]
RewriteRule ^ %1 [R=301,L,NE]
## REWRITE NON-WWW TO WWW (EXCEPT ON LOCALHOST) ##
RewriteCond %{HTTP_HOST} !(^www'.|localhost) [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]
# url is ONLY '/en' or '/de' -> redirect to /en/ or /de/ (adding slash)
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+?[^/])$ %{REQUEST_URI}/ [L,R=302,NE]
# handle /en/news/2452/lorem-ipsum/
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}'s(.*[a-z]{2})/?'?page=([^'s&]+)&id=([^'s&]+)&news=([^'s&]+) [NC]
RewriteRule ^ %1/%2/%3/%4/? [R=302,L,NE]
RewriteRule ^(en|nl)/(news)/('d+)/(['w-]+)/?$ index.php?lang=$1&page=$2&id=$3&news=$4 [L,QSA]
# handle /en/info
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}'s(.*[a-z]{2})/?'?page=([^'s&]+) [NC]
RewriteRule ^ %1/%2/? [R=302,L,NE]
RewriteRule ^(en|nl)/(['w-]+)/?$ index.php?lang=$1&page=$2 [L,QSA]
# now all urls have en/ OR de/ -> parse them
RewriteRule ^(en|nl)/(.*)$  %{ENV:FRB}$2?lang=$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?$1 [L,QSA]

尝试删除RewriteRule上的R=301

通过该命令,您告诉服务器它应该返回301错误代码,并将新的url提供给浏览器。浏览器将获取该URL并执行新的GET。

如果没有R=301,服务器将在内部发挥"魔力";-)