1

我有一个带有这种 url 的域 www.domain.com

www.domain.com/my-italian-page.html(已经被其他htaccess规则重写)

我想创建一个假的多语言网址,例如

www.domain.com/my-english-page.html

用户将在地址栏中看到重写器 url www.domain.com/my-english-page.html但我想显示的内容是原始的www.domain.com/my-italian-page.html .

我在共享服务器上,所以我不能使用 apache vhost 规则,所以我必须通过 htaccess 找到解决方案。

有人可以帮我找到正确的方法吗?

谢谢

4

2 回答 2

1

所以你想要指向意大利内容的英文 URL?希望您生成这些重写规则的 php 脚本进行翻译。但是你会为你的每一页都这样做:

RewriteRule ^/?english-page.html$ /italian-page.html [L]

对于您的每一页。

于 2012-08-26T17:52:57.713 回答
0

通常,您希望在 Web 服务器中执行的代码尽可能小,因此为每个页面设置重写规则通常不是一个好主意。我建议在启用 SEO URL 时采用大多数 CMS 的工作方式:

  • 将任何 url(mydomain/anytext.html[实际上你也不应该使用 .html 扩展名])重写为脚本(例如mydomain.tld/translate.php

  • 使用$_SERVER['PATH_INFO'](应该包含anytext.html)的内容来显示正确的页面

  • 如果页面不存在,请设置正确的 HTTP 响应代码:(http_response_code(...)有关 php5 5.4 以下的函数,请参阅此答案的结尾:PHP:如何发送 HTTP 响应代码?

.htaccess 示例(实际上最初是“被盗”并从typo3 设置中严重修改)

RewriteEngine On

# Uncomment and modify line below if your script is not in web-root
#RewriteBase / 
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule (.*) translate.php$1 [L]

非常基本的类伪代码(未测试,可能存在语法错误)示例:

<?php
// using a database? you have to escape the string
$db = setup_db();
$page = db->escape_string(basename($_SERVER['PATH_INFO']));
$page = my_translate_query($page);

// no database? do something like this.
$trans = array( 'english' => 'italian', 'italian' => 'italian' );
$page = 'default-name-or-empty-string';
if(isset($_SERVER['PATH_INFO'])) {
   if(isset($trans[basename($_SERVER['PATH_INFO'])])) {
      $page = $trans[$trans[basename($_SERVER['PATH_INFO'])]];
   }
   else {
      http_response_code(404);
      exit();
   }
}

// need to redirect to another script? use this (causes reload in browser)
header("Location: otherscript.php/$page");
// you could also include it (no reload), try something like this
$_SERVER['PATH_INFO'] = '/'.$page;
// you *may* have to modify other variables like $_SERVER['PHP_SELF']
// to point to the other script
include('otherscript.php');
?>

我在您的回答中看到您有另一个脚本 -dispatcher.php您似乎不愿意修改。我相应地修改了我的回复,但请记住,到目前为止,最简单的方法是修改现有脚本以处理任何英文路径本身。

于 2012-08-27T10:53:21.963 回答