使用 htaccess URLrewrite 设置语言

Posted

技术标签:

【中文标题】使用 htaccess URLrewrite 设置语言【英文标题】:Set language using htaccess URLrewrite 【发布时间】:2013-09-28 10:41:46 【问题描述】:

例如,我的根目录中有两个文件:one.phptwo.php。我想通过这些 url 访问它们,而不必实际拥有物理目录 en+de。

mydomain.com/en/一个 mydomain.com/en/两个 mydomain.com/de/一个 mydomain.com/de/两个

所以第一个目录将被“忽略”,只需将带有语言设置的 GET 变量传递给 php 文件,第二个目录是没有扩展名的 php 文件。

到目前为止,这就是我在 htaccess 中使用的文件扩展名:

RewriteEngine on  
RewriteCond %REQUEST_FILENAME !-d   
RewriteCond %REQUEST_FILENAME\.php -f   
RewriteRule ^(.*)$ $1.php

更新/解决方案 这很有用:.htaccess rule for language detection 这似乎几乎符合我的要求:

RewriteRule ^(en|de|fr)/(.*)$  $2?lang=$1 [L,QSA]   
RewriteRule ^(.*)$  $1?lang=en [L,QSA]

还有一个问题 对于 mydomain.com/en/one/id45 如果我想将 id45 作为变量传递给 one.php 我必须在 htaccess 中添加哪一行?

【问题讨论】:

您的问题不清楚。 one.php and two.php 是在根目录中还是在 en/de/ 文件夹中? 文件在根目录中...我不想在物理上拥有 en+de 文件夹我只需要它们在语言变量的 URL 中 @anubhava:希望这能让它更清楚。 请在您的问题中发布格式正确的代码示例,而不是在它们非常不可读的 cmets 中。 @TomSenner 你应该发布你的更新作为答案,因为它就是答案。 【参考方案1】:

你可以试试这个规则:

DirectoryIndex index.php index.html
DirectorySlash On

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %REQUEST_FILENAME !-d
RewriteCond %DOCUMENT_ROOT/$2.php -f
RewriteRule ^(en|de|fr)/([^/]+)(?:/(.*)|)$ $2.php?lang=$1&var=$3 [L,QSA,NC]

RewriteCond %REQUEST_FILENAME !-d   
RewriteCond %REQUEST_FILENAME.php -f   
RewriteRule ^(.+?)/?$ $1.php [L]

RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^([a-z]2)/?$ index.php?lang=$1 [L,QSA,NC]

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^([^/]+)/?$ $1?lang=en [L,QSA]

【讨论】:

谢谢,但它会导致“500 内部服务器错误”,也许我的其他代码是错误的:RewriteEngine onRewriteCond %REQUEST_FILENAME !-dRewriteCond %REQUEST_FILENAME\.php -f@987654325 @RewriteRule ^(en|de|fr)/([^/]+)/(.*)$ $2.php?lang=$1&var=$3 [L,QSA,NC]RewriteRule ^(.*)$ $1?lang=de [L,QSA] 您的代码适用于 mydomain.com/en/one/id45,但我现在将为 mydomain.com/en/one 获得 404,尽管文件 one.php 存在 感谢几乎完美:只有 mydomain.com/en/、mydomain.com/fr/ 等给出 404 错误,而不是使用 index.php 但是目录不存在! mydomain.com/en/one -> 将使用 one.php 作为文件,因此 mydomain.com/en/ 应该使用 one.php 所在目录中的 index.php。 (感谢您的大力帮助) 为什么语言有多个 RewriteRule?以及为什么如果我输入 example.com/en/home 会加载 CSS,但如果我输入 example.com/de/home 则不会加载

以上是关于使用 htaccess URLrewrite 设置语言的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess转为web.config的操作技巧 apache伪静态转为iis伪静态

新浪SAE URLRewrite(伪静态重定向)详解

Apache伪静态(Rewrite).htaccess文件详解

Apache学习笔记

我想用 .htaccess 禁用目录而不是子目录的访问

IIS7 urlrewrite 模块 - 外部 xml 文件中的规则