Назад | Перейти на главную страницу

Как я могу переписать из / page в / xx / page, используя только htaccess и apache?

Привет, я нашел много ресурсов по мод-перезаписи и 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>

Не нужно указывать 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. Больше ничего не подходит

Вы можете показать нам директивы, которые настраивают виртуальные каталоги?