Как заставить Apache RewriteRule работать правильно для поддоменов? - PullRequest
5 голосов
/ 23 апреля 2010

Я просто настроил поддомен со следующим RewriteCond:

RewriteCond $1 !^search.php$  
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/?([^/]+)$ search.php?q=$1 [L,NS] 

Я использую то же условие перезаписи на основном домене, и оно отлично работает. Однако когда я настраиваю его на поддомене, он просто выводит «index.php» при переходе к http://sub.domain.com

Каждая страница субдомена выводит имя страницы в теле вместо обработки кода, за исключением страницы поиска, которая, кажется, работает правильно.

Что я могу сделать, чтобы исправить эту проблему?

Ответы [ 4 ]

1 голос
/ 01 октября 2010

В основной конфигурации путь всегда начинается с /, и вам нужен абсолютный путь:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^search.php$                                                                                                                                                                             
RewriteCond %{REQUEST_FILENAME} !-f                                                                                                                                                                                       
RewriteRule ^/([^/]+)$ %{DOCUMENT_ROOT}/search.php?q=$1 [L]   

В .htaccess вам нужен RewriteBase, который удаляется из URL (сейчас нет / в правиле), а путь относительный.

RewriteEngine On
RewriteBase /                                                                                                                                                                                                             
RewriteCond %{REQUEST_FILENAME} !^search.php$                                                                                                                                                                             
RewriteCond %{REQUEST_FILENAME} !-f                                                                                                                                                                                       
RewriteRule ^([^/]+)$ search.php?q=$1 [L]   
1 голос
/ 15 июля 2010

Я не играл с вашим регулярным выражением с mod_rewrite, но если бы я пытался написать это регулярное выражение в другом движке, мне пришлось бы избежать косой черты. Кроме того, учитывая, что $ используется для обозначения обратной ссылки, это тоже нужно будет экранировать (потребуются ли ваши символы $ в регулярном выражении, поскольку в URI может быть больше текста, и он не сопоставляется в конце строки )

Я бы попробовал

RewriteCond $1 !^search.php$  
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/?([^\/]+)$ search.php?q=$1 [L,NS] 

Еще одна вещь. Обычно $ в конце регулярного выражения означает «только совпадать, если это конец строки». Таким образом, если RewriteCond совпадает с ^ search.php $, но URL-адрес search.php? Q = ..., то я думаю, что это не будет совпадать, поскольку search.php не является концом строки. Так что это выглядело бы следующим образом (при условии, что вам не нужно что-то менять по сравнению с оригиналом).

RewriteCond $1 !^search.php
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/?([^/]+)$ search.php?q=$1 [L,NS] 
0 голосов
/ 04 мая 2010

Похоже, что шаблон '^ /? ([^ /] +) $' Может не совпадать вообще.

Я бы активировал RewriteLog , провернул бы RewriteLogLevel до уровня 3 или выше и посмотрел бы, соответствует ли ваш шаблон вообще. Если нет, начните с более простого шаблона, а затем переходите к более сложному шаблону.

Или что-то еще соответствует шаблону, поэтому запрос никогда не попадает в 'RewriteRule ^ /? ([^ /] +) $' Вообще. Вы увидите это в RewriteLog.

Я полагаю, что недавно у меня возникла проблема, когда «^ /» в некоторых случаях не совпадало на виртуальном хосте. Но '/' сработало. Ребята из #httpd на Freenode.org помогли мне. Если я смогу найти это в своих заметках, я опубликую это здесь.

0 голосов
/ 26 апреля 2010

Несколько вещей приходят на ум здесь:

У меня есть несколько предложений / комментариев / ошибок. Надеюсь, один из них вам пригодится:

  1. Убедитесь, что search.php не просто отображает параметры $_GET. Хотя это кажется очевидным в ретроспективе, это одно из наиболее игнорируемых решений.
  2. RewriteRule работает немного иначе, когда вы указываете его в файле конфигурации сервера, чем если вы указываете его в .htaccess. В частности, ^/ неверно в версии конфигурации сервера, поскольку используется весь URL (http://sub.domain.com/blah).
  3. Убедитесь, что никакие другие правила перезаписи не обрабатываются в первую очередь для этого субдомена, в основном httpd.conf / apache2.conf или .htaccess.
  4. Убедитесь, что в вашей конфигурации отображается RewriteEngine On, так как он активируется за VirtualHost.
  5. Флаг NS будет игнорировать перенаправления, выполненные с использованием относительного Redirect или относительного RewriteRule.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...