Php 重写多个URL';它具有.htaccess

Php 重写多个URL';它具有.htaccess,php,apache,.htaccess,url,mod-rewrite,Php,Apache,.htaccess,Url,Mod Rewrite,我需要一些帮助,为我的网站重写不同的URL。这是一个多语言的网站,所以有点复杂。我已经设法使一些事情运作起来了。到目前为止,我的代码就是这样做的: 定义重写基(因为本地主机和生产服务器具有不同的基) 将www.mysite.com重写为www.mysite.com/en/(或其他语言,具体取决于“lang”参数) 将非www重定向到www 从URL中删除index.php 我想要什么 但我对代码有两个问题: 它重定向到。但我不想要最后一个参数,我也无法用我的基本技能来隐藏“lang”。如何

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

  • 定义重写基(因为本地主机和生产服务器具有不同的基)
  • 将www.mysite.com重写为www.mysite.com/en/(或其他语言,具体取决于“lang”参数)
  • 将非www重定向到www
  • 从URL中删除index.php
我想要什么 但我对代码有两个问题:

  • 它重定向到。但我不想要最后一个参数,我也无法用我的基本技能来隐藏“lang”。如何防止将该参数添加到URL
  • 当我转到时,比方说,/en/没有添加到URL。如何解决这个问题?它应该始终在每个url中,在域之后添加语言
除此之外,我希望有两个额外的重写规则,但我不希望我的htaccess一团糟。所以我希望有人能给我指出正确的方向。在我的htaccess中执行此操作的最佳方式是什么

  • 参数“page”包含正在显示且应重写的页面:->(我已经知道如何隐藏index.php,请参阅下面的代码)

  • 我的新闻页()应该重写为

对于所有这些规则:URL应该以/结尾,如果没有,它应该添加:so->

这是我现在的代码:

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]

尝试删除重写规则上的
R=301

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


如果没有R=301,服务器将在内部执行“魔术”;-)

多谢各位。大多数东西都在工作!!只有其他参数(如页面)不会被重写。它仍然是和重写工程伟大!它只显示一个“未找到对象”页面,因此不显示该页面。当出现404错误时,浏览器中会显示什么URL?正确的URL(例如和)`index.php是否存在于该htaccess所在的同一目录中?