我怎样才能仅使用 htaccess 和 apache 将 /page 重写为 /xx/page?

我怎样才能仅使用 htaccess 和 apache 将 /page 重写为 /xx/page?

你好,我找到了许多有关 mod-rewrite 和 Apache 的资源,但是我却无法成功制作出一个可行的示例。

下面的例子适用于

✓ 作品example.com/en/page1.phpexample.com/page1.php?ln=en(内部重定向)

✓ 作品example.com/page1.phpexample.com/en/page1.php(重定向)

✓ 作品example.com/en/example.com/index.php?ln=en(内部重定向)

✓ 作品example.com/example.com/en/(重定向)

✓ 作品example.com/blahblahexample.com/en/error.php(重定向)

✓ 作品example.com/en/blahblahexample.com/en/error.php(重定向)

✖ 失败example.com/deexample.com/en/error.php(重定向 -应该是 example.com/de/

✖ 失败example.com/de/blahblahexample.com/en/error.php(重定向 -应该是 example.com/de/error.php

    <IfModule mod_rewrite.c>
        RewriteEngine   On
        DirectorySlash  On

        # Force hostname without www REDIRECT
        RewriteCond     %{HTTP_HOST}            !^example\.com [NC]
        RewriteCond     %{HTTP_HOST}            !^$
        RewriteRule     ^(.*)$                  http://%1/$1 [R=301]

        # /xx/somepage.php -> /somepage.php?ln=xx INTERNAL REWRITE
        RewriteCond     %{REQUEST_URI}          ^/../.+ [NC]
        RewriteRule     ^(en|de)/(.*)           $2?ln=$1&%{QUERY_STRING} [L]

        # /en -> /en/ REDIRECT
        RewriteCond     %{REQUEST_URI}          ^/..$ [NC]
        RewriteRule     ^(.*)$                  $1/ [R=302,L]

        # /somepage.php -> /en/somepage.php REDIRECT
        RewriteCond     %{REQUEST_URI}          !^/../ [NC]
        RewriteCond     %{ENV:REDIRECT_STATUS}  !=200
        RewriteRule     ^(.*)$                  /en%{REQUEST_URI} [R=302,L]

        # /en/ -> /en/index.php INTERNAL REWRITE
        RewriteCond     %{REQUEST_URI}          !^/../.+ [NC]
        RewriteCond     %{ENV:REDIRECT_STATUS}  !=200
        RewriteRule     ^(.*)$                  /$1index.php [L]
    </IfModule>

★ 注1:R=302用于调试。在服务器上它实际上是R=301

★ 注2:它在Apache 2.2上,因此位%{ENV:REDIRECT_STATUS} !=200试图模拟[END]后来的Apache 3.2.9的标志。

谢谢!

★ 编辑:以下是更多 .conf 文件

<Directory /var/www/vhosts/example.com/httpdocs>
    Options +FollowSymLinks -Indexes
    AllowOverride           All

    AddDefaultCharset       utf-8

    ErrorDocument           400             /error.php
    ErrorDocument           401             /error.php
    ErrorDocument           402             /error.php
    ...
    ErrorDocument           500             /error.php

    [above code here]
</Directory>

答案1

RewriteCond如果您可以指定匹配,则无需指定RewriteRule。例如:

    # /xx/somepage.php -> /somepage.php?ln=xx INTERNAL REWRITE

    RewriteCond     %{REQUEST_URI}          ^/../.+ [NC]
    RewriteRule     ^(en|de)/(.*)           $2?ln=$1&%{QUERY_STRING} [L]

应该只适用于:

    # /xx/somepage.php -> /somepage.php?ln=xx INTERNAL REWRITE
    RewriteRule     ^(en|de)/(.*)           $2?ln=$1&%{QUERY_STRING} [L]

浏览两个不起作用的 URL:

example.com/de

  1. 匹配带有# /en -> /en/ REDIRECT注释的重写,URI 变为/de/
  2. 不匹配任何其他规则。您是否期望它匹配最后两条规则?由于 ,它们不会匹配%{ENV:REDIRECT_STATUS} != 200

直接访问example.com/de/和上面的URL结果是否不一样?

example.com/de/blahblah

  1. 匹配带有# /xx/somepage.php -> /somepage.php?ln=xx注释的重写,URI 变为blahblah.php?ln=de&othergetvars
  2. 其他均不匹配

您能向我们展示配置虚拟目录的指令吗?

相关内容