Исправьте RegEx, чтобы избежать бесконечного цикла, используя RewriteRule для перенаправления 301

Я пытаюсь заставить мой сервер перенаправить следующие запросы:

http://example.es
http://example.es/
http://example.es/es
http://example.es/es/
http://www.example.es
http://www.example.es/
http://www.example.es/es

на эту страницу:

http://www.example.es/es/

Для этого у меня есть следующее в моем.htaccess

#RewriteEngine On    # Turn on the rewriting engine
RewriteBase /
RewriteCond %{HTTP_HOST} ^(\.?example\.es(/|/es|/es/)?|www\.?example\.es(/|/es)?)$ [NC]
RewriteRule ^(.*)$ http://www.example.es/es/ [R=301,L]

Проблема в том, что это вызывает бесконечные перенаправления, так как в искомом URL http://www.example.com/es/ также есть строка HTTP_HOST. Дело в том, что я не могу найти точное регулярное выражение, чтобы избежать этой проблемы.

Остальная часть.htaccess выглядит следующим образом:

php_flag register_long_arrays on
php_flag register_globals on
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css javascript application/javascript
ExpiresActive On
ExpiresByType text/css "access plus 1 years"
ExpiresByType image/png "access plus 1 years"
ExpiresByType application/javascript "access plus 1 years"

Header set Connection keep-alive

Помощь очень очень ценится!

Ура!

3 ответа

AFAIK При переписывании Apache используется регулярное выражение PERL, поэтому поддерживаются негативные запросы. Вы можете использовать один, чтобы избежать соответствия http://www.example.com/es/ к себе. Пытаться:

^(\.?example\.com(/|/es|/es/)?|www\.?example\.com(/|/es(?!/))?)$

Помни что %{HTTP_HOST} соответствует только имени хоста в URL.

Замените ваш код следующим:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On

RewriteCond %{HTTP_HOST} ^(www\.)?(example\.ws)$ [NC]
RewriteRule (?!^es/)^(.*)$ http://www.%1/es/$1 [R=301,L,NC]

Я получаю ответ, как это:

Options +FollowSymLinks -MultiViews
RewriteEngine On    # Turn on the rewriting engine
RewriteCond %{HTTP_HOST} ^(www\.)?(example\.es)$ [NC]
RewriteRule ^(/|/es|/es/)?$ http://www.example.es/es/$1 [R=301,L,NC]

Спасибо за вашу помощь!!

Другие вопросы по тегам