多语言和mod_rewrite

时间:2015-07-29 07:32:46

标签: php apache .htaccess mod-rewrite

我有一个多语言网站。我希望网址如下:http://example.com/en/blog_post/2其中blog_post是文件blog_post.php的名称,2是参数ID的值。

我现在有.htaccess代码

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^(bg|en)/(.*)$ /$2?lang=$1 [L]
RewriteRule ^(bg|en)/(.*)/([^/.]+)$ /$2?lang=$1&id=$3 [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) $1.php [L]

我试过这条线,但它不起作用:
RewriteRule ^(bg|en)/(.*)/([^/\.]+)$ /$2?lang=$1&id=$3 [L]

你能帮帮我吗?)

2 个答案:

答案 0 :(得分:1)

我做到了。它适用于这些线。感谢大家:)

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^(bg|en)/post/([^/\.]+)$ blog_post.php?lang=$1&id=$2 [L]
RewriteRule ^(bg|en)/(.*)$ $2?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) $1.php [L]

答案 1 :(得分:1)

如上所述,这些指令的顺序很重要。更一般的规则应该采用更具体的规则,这是上述问题的关键问题。但是,还需要更改模式(更具体),以防止其他格式错误的URL触发500内部服务器错误并破坏您的站点。例如。 /en/blog_post/2/3(一个额外的 - 错误的 - /something)仍会在上面的“修复”代码中触发500错误。

所以,这可以写成:

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^(bg|en)/([^/.]+)$ /$2?lang=$1
RewriteRule ^(bg|en)/([^/.]+)/([^/.]+)$ /$2?lang=$1&id=$3

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.*) /$1.php [L]

通用(.*)模式已替换为([^/.]+),仅匹配路径段(不包括斜杠)。通过这样做,这也意味着订单不再重要,/en/blog_post/2/3只会产生404。

我还删除了初始L指令中的RewriteRule标记,因为您无论如何都需要继续追加.php扩展名。

RewriteRule替换也应保持为root-relative,即。以斜线开头。 (或者您应该包含RewriteBase指令。)

我还添加了另一个RewriteCond指令,以确保在附加文件扩展名之前<file>.php实际存在。如果您不这样做并且<file>.php不存在,那么您将收到另外500个错误。

如果你不介意有一个空的RewriteRule参数(大概是你的脚本处理的话),你可以将两个id=组合成一个:

RewriteRule ^(bg|en)/([^/.]+)(?:/([^/.]+))?$ /$2?lang=$1&id=$3

这会处理/en/blog_post/en/blog_post/2个请求。

相关问题