Привет, я нашел много ресурсов по мод-перезаписи и Apache, но мне не удалось создать рабочий пример.
Пример ниже работает для
✓ РАБОТАЕТ example.com/en/page1.php ☞ example.com/page1.php?ln=en (внутреннее перенаправление)
✓ РАБОТАЕТ example.com/page1.php ☞ example.com/en/page1.php (перенаправление)
✓ РАБОТАЕТ example.com/en/ ☞ example.com/index.php?ln=en (внутреннее перенаправление)
✓ РАБОТАЕТ example.com/ ☞ example.com/en/ (перенаправление)
✓ РАБОТАЕТ example.com/blahblah ☞ example.com/en/error.php (перенаправление)
✓ РАБОТАЕТ example.com/en/blahblah ☞ example.com/en/error.php (перенаправление)
✖ ОТКАЗЫ example.com/de ☞ example.com/en/error.php (перенаправление - ДОЛЖЕН БЫТЬ example.com/de/)
✖ ОТКАЗЫ example.com/de/blahblah ☞ example.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
# /en -> /en/ REDIRECT
комментарий, и URI станет /de/
%{ENV:REDIRECT_STATUS} != 200
.Имеет ли доступ example.com/de/
напрямую имеют другие результаты, чем указанный выше URL?
example.com/de/blahblah
# /xx/somepage.php -> /somepage.php?ln=xx
комментарий и URI становится blahblah.php?ln=de&othergetvars
Вы можете показать нам директивы, которые настраивают виртуальные каталоги?