Я как всегда борюсь с mod_rewrite. У нас есть несколько клиентских порталов, работающих через мультисайт WordPress, доступ к которым осуществляется через подкаталог: portal
.
Например: http://www.mydomain.com/portal/clientA/
Я хотел бы иметь возможность попасть туда, просто набрав http://www.mydomain.com/clientA/
, и это перенаправит меня на http://www.mydomain.com/portal/clientA/
Вот что у меня есть до сих пор, и я не могу ничего переписать:
RewriteCond %{REQUEST_URI} /portal/
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . - [S=1]
RewriteRule /clientA(/?) /portal/clientA/
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Вторую часть я не могу трогать, потому что она нужна WordPress. Мой шаблон также пытается предвидеть, что кто-то не поставит косую черту в конце, поэтому (/?)
EDIT: я также должен отметить, что я не хочу создавать более общее правило - мне удобно добавлять правило перезаписи для каждого нового клиента и каждый раз увеличивать число S=x
.
РЕДАКТИРОВАТЬ (11 августа). Итак, немного повозившись, это то, что находится в моем .htaccess:
RewriteEngine On
RewriteRule ^clientA(/?) /portal/clientA/ [R]
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Излишне говорить, что это не работает. Однако первая часть работает, если я удалю весь раздел WordPress. Мне нужно, чтобы они ОБА работали одновременно. ЧТО такого в части WordPress, которая вызывает сбой первого раздела? Я предполагаю, что это комбинация RewriteBase и самого последнего правила, которое сравнивает все остальное с /index.php, что, честно говоря, немного обломно. На самом деле я не совсем понимаю, как это правило может работать даже в многосайтовом контексте, и тем не менее, похоже, что оно работает.
ОКОНЧАТЕЛЬНОЕ РЕШЕНИЕ спасибо LazyOne за правильный ответ! Для справки других, окончательное решение, которое я использовал, было:
RewriteEngine On
RewriteRule ^clientA(/.+)? /portal/clientA$1 [R,L]
RewriteRule ^clientB(/.+)? /portal/clientB$1 [R,L]
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
[L]
переходит к следующей итерации (именно так это работает —L
не означает прекратить переписывание и немедленно уйти) .. и все равно достигнет правил перезаписи WordPress. Но да, вы можете немного ускорить его, удалив флагL
. Остальное зависит от WordPress, сможет ли он обработать ссылку/portal/clientA/something
. О флаге [L]: stackoverflow.com/questions/6797998/ . Если у вас есть свои правила перезаписи в конфигурации сервера, то флаг [L] лучше вообще не использовать. 11.08.2011http://wordpress.stackexchange.com/questions/68078/why-my-htacess-rewrite-return-404
, вы можете мне помочь? спасибо 13.10.2012def
(или любое другое настоящее имя)? Возможно, у вас есть какие-то другие правила перезаписи (в файле .htaccess в этой папке), которые не позволяют вам переписывать дальше. Нынешние правила мне кажутся приемлемыми. 13.10.2012$req_uri = preg_replace(@'/^\/?p\/([-a-zA-Z0-9_]+)\//', '', $_SERVER['REQUEST_URI']);
Где мой шаблон перезаписи подкаталога — /p/anyword/(take_to_root). Надеюсь, это поможет кому-то! Было больно найти способ сделать это. 22.11.2012