【问题标题】:Multilanguage and mod_rewrite多语言和 mod_rewrite
【发布时间】:2015-10-20 01:16:38
【问题描述】:

我有一个多语言网站。我希望 URL 类似于:http://example.com/en/blog_post/2 其中blog_post 是文件的名称blog_post.php2 是参数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]

你能帮帮我吗:)

【问题讨论】:

  • 在您的上下文中“不起作用”是什么意思?您最有可能看到的错误更具体:)
  • 我尝试使用此 URL localhost:1234/en/blog_post/2 结果是内部服务器错误
  • 您的 cmets(例如 //this make url's like site.com/en/)在您的实际文件中吗?那肯定是无效的,会导致 500 错误!
  • 不,我只在这里评论:)
  • 您最初的Options 指令应该有一个+。 IE。 Options +FollowSymLinks。如果没有+,您将覆盖所有其他设置 - 尽管这可能仍然可以。

标签: php apache .htaccess mod-rewrite


【解决方案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]

【讨论】:

  • 很高兴你把它整理好了。指令的顺序是这里的关键问题,但是,还有其他问题需要解决以处理格式错误的 URL。我添加了另一个答案来解释这一点。
【解决方案2】:

如上所述,这些指令的顺序很重要。更具体的规则应该在更一般的规则之前,这是上面的一个关键问题。但是,还需要更改模式(更具体)以防止其他格式错误的 URL 触发 500 Internal Server Error 并破坏您的站点。例如。 /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。

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

RewriteRule 替换也应保持为根相对,即。以斜线开头。 (或者你应该包含RewriteBase 指令。)

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

如果您不介意有一个空的 id= 参数(大概是您的脚本可以处理),您可以将两个 RewriteRules 合并为一个:

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

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

【讨论】:

    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多