Перезапись URL не работает, если доступ к сайту осуществляется через каталог псевдонимов. - PullRequest
4 голосов
/ 13 февраля 2012

У меня есть веб-сайт в каталоге d:\www\mysite на моем локальном компьютере.Я установил WAMPServer и настроил каталог псевдонимов mysite для своего сайта.

Так, например, http://localhost/mysite/static-resource.html правильно извлекает мой файл, который находится в d:\www\mysite\static-resource.html.

Моя проблемас перезаписью URL в моем .htaccess файле:

RewriteEngine On    
RewriteRule ^articles/(\d+) ./article.php?id=$1

Когда я пытаюсь получить доступ к http://localhost/mysite/articles/1, я получаю следующий ответ:

Not Found

Запрошенный URL /www/mysite/article.php не был найден на этом сервере.

Я могу подтвердить, что существует файл article.php в d:\www\mysite\article.php.

Раньше у меня был корень моего сайта (d:\www\mysite), настроенный как DocumentRoot сервера Apache (вместо c:\wamp\www, который используется по умолчанию), и в этом сценарии перезапись моего URL работал , поэтому моя текущая проблема должна быть связана с тем фактом, что мой сайт находится "за" каталогом псевдонимов.


Содержимое моего mysite.conf файла:

Alias /mysite/ "d:/www/mysite/" 

<Directory "d:/www/mysite/">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride all
        Order allow,deny
    Allow from all
</Directory>

1 Ответ

7 голосов
/ 13 февраля 2012

Я не вижу RewriteBase в ваших правилах перезаписи.
В вашем .htaccess добавьте правило RewriteBase.

RewriteEngine On    
RewriteBase /mysite/
RewriteRule ^articles/(\d+) ./article.php?id=$1

RewriteBase должен иметь /mysite/ из-за вашего Alias /mysite/ "d:/www/mysite/"

Если доступен только http://localhost/mysite, он должен вернуть not found on this server. Если вы не хотите, чтобы это произошло, добавьте еще один псевдоним вместе с приведенным выше:

Alias /mysite "d:/www/mysite/" 

или

Только так:

AliasMatch /mysite(/.*)? d:/www/mysite/$1 

почему RewriteBase? от Директива RewriteBase Документы Apache :

Директива RewriteBase явно устанавливает базовый URL для перезаписей для каждого каталога. Как вы увидите ниже, RewriteRule можно использовать в конфигурационных файлах для каждого каталога (.htaccess). В таком случае он будет действовать локально, удаляя префикс локального каталога перед обработкой, и применяя правила перезаписи только к оставшейся части. Когда обработка завершена, префикс автоматически добавляется обратно в путь. Значение по умолчанию: RewriteBase физический каталог-путь

Когда происходит замена для нового URL-адреса, этот модуль должен повторно внедрить URL-адрес в обработку на сервере. Для того, чтобы сделать это, ему нужно знать, что такое соответствующий URL-префикс или URL-база. По умолчанию этот префикс представляет собой соответствующий путь к файлу. Однако для большинства веб-сайтов URL-адреса НЕ напрямую связаны с физическими путями к именам файлов, поэтому это предположение часто ошибочно! Следовательно, вы можете использовать директиву RewriteBase, чтобы указать правильный URL-префикс.

Пример из Директива RewriteBase Документы Apache :

#
#  /abc/def/.htaccess -- per-dir config file for directory /abc/def
#  Remember: /abc/def is the physical path of /xyz, i.e., the server
#            has a 'Alias /xyz /abc/def' directive e.g.
#

RewriteEngine On

#  let the server know that we were reached via /xyz and not
#  via the physical path prefix /abc/def
RewriteBase   /xyz

#  now the rewriting rules
RewriteRule   ^oldstuff\.html$  newstuff.html
...