繁体   English   中英

用.htaccess重写多个URL

[英]Rewriting multiple URL's with .htaccess

我需要一些帮助来为我的网站重写不同的URL。 这是一个多语言站点,因此使其变得有些复杂。 我设法使某些事情起作用。 到目前为止,这是我的代码执行的操作:

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

我想要的是

但是我的代码有两个问题:

  • 它将重定向到http://www.example.com/en/?lang=en 但是我不想要最后一个参数,我无法用我的基本技能弄清楚如何隐藏“ lang”。 如何防止将该参数添加到URL?
  • 当我进入时,可以说http://www.example.com/?page=news / en /未添加到URL。 如何解决? 它应该始终在每个url中的域后添加语言。

除此之外,我还想再添加两个重写器,但我不希望htaccess变得一团糟。 所以我希望有人能指出我正确的方向。 在htaccess中执行此操作的最佳方法是什么?

对于所有这些规则: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,服务器将在内部执行“魔术”操作;-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM