Apache mod_rewrite ничего не делает (?) - PullRequest
0 голосов
/ 31 октября 2010

У меня проблемы с Apache mod_rewrite. Одна из вещей, которые я пытаюсь сделать, это скрыть некоторые детали моей реализации, так что, например, пользователь видит URL http://www.mysite.com/login, но Apache отвечает со страницей http://www.mysite.com/doc_root/login.php вместо этого (желательно без указания пользователю, что это файл PHP или структура каталогов). Вот что у меня в файле .htaccess:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?mysite.com*
RewriteRule ^/(\w+) /doc_root/$1.php [L]

#Redirect http://www.mysite.com to the login page
RewriteRule ^/?$ https://www.mysite.com/doc_root/login.php

Но когда я перехожу к http://www.mysite.com/login,, я получаю ошибку 404, даже если страница существует. Я явно не очень хорошо понимаю, как работают условия и правила mod_rewrite, поэтому кто-нибудь может сказать мне, что я делаю неправильно? Благодаря.

Ответы [ 2 ]

0 голосов
/ 31 октября 2010
  • Если на вашем сайте нет множества разных доменных имен, и вы только хотите, чтобы mysite.com делал переписывание, вам не нужен RewriteCond.(Потенциальная проблема. Apache любит разбираться с доменным именем, если вы не установите UseCanonicalName off. Если имя не соответствует ожидаемому, перезапись не произойдет.)
  • В RewriteCond (и RewriteRule)паттерны, . соответствует любому символу.Добавьте обратную косую черту перед ними.(Незначительная ошибка. Не должна приводить к сбою перезаписей, но они также будут соответствовать таким вещам, как «mysite-com».)
  • mod_rewrite на самом деле является фильтром URL-адресов к имени файла.Хотя он часто используется для перезаписи URL-адресов на другие URL-адреса, иногда он будет плохо себя вести, если то, что вы переписываете, является URL-адресом, и он не может сказать.(Особенно если то, что он переписывает, будет псевдонимом или иначе не будет переводиться напрямую в реальное имя файла.) Однако, если вы добавите флаг [PT] к своему правилу, он сочтет переписанный объект URL-адресом и передаст егок другим фильтрам (включая те, которые превращают URL в имена файлов).
  • Вам действительно нужен "/ doc_root"?Корень документа уже должен быть настроен в Apache с использованием директивы DocumentRoot, и он не должен быть частью URL, если у вас несколько приложений в одном домене (в этом случае это корень приложения; корень документа нене меняется).

ОБНОВЛЕНИЕ:

  • Еще одна вещь, о которой я только что подумал: правила перезаписи работают по-разному в файлах .htaccess.Апач любит сдирать ведущий слеш.Таким образом, вы, вероятно, захотите избавиться от первой косой черты в своих шаблонах или, по крайней мере, сделать ее необязательной (^/?login вместо ^/login).
  • ^/?(\w+) будет соответствовать /doc_root/login.phpи вызвать перезапись в /doc_root/doc_root.php.Вы, вероятно, должны иметь $ в конце вашего паттерна.
0 голосов
/ 31 октября 2010

Возьмите doc_root из всего, что у вас есть. Это даст вам результат, о котором вы просите.Однако я не уверен, желательно это или нет.Как вы собираетесь заставить кого-то войти в систему, если он вручную наберет http://www.mysite.com/index.php?

Кроме того, если вы пытаетесь принудить весь трафик к SSL, лучше использовать второй VirtualHost и Redirect вместоmod_rewrite.Все эти вопросы, вероятно, лучше подходят для ServerFault

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...