Почему Apache RewriteRule показывает локальные пути? - PullRequest
15 голосов
/ 22 июля 2009

Я пытаюсь использовать RewriteRules в .htaccess с относительными путями, но Apache, похоже, хочет выводить физический путь вместо server каждый раз, когда я пытаюсь вывести относительный путь. Абсолютные и корневые пути сервера работают нормально. Например:

RewriteEngine On

# this works fine, 127.0.0.1/ab redirects to 127.0.0.1/cd
RewriteRule ^ab$ /cd [R]

# this doesn't work... 127.0.0.1/wx redirects to 127.0.0.1/C:/path/to/files/yz
RewriteRule ^wx$ yz [R]

Добавление «RewriteBase /» решает проблему, но утомительно добавлять путь к каждому .htaccess и усложнять изменение структуры каталогов. Существует ли причина, по которой RewriteBase по умолчанию использует текущий физический путь вместо текущего URI путь?

Ответы [ 3 ]

12 голосов
/ 27 декабря 2011

Для тех, кто случайно попал сюда из Google (как и я), краткий контрольный список:

  • Убедитесь, что у вас есть RewriteBase / (или любое другое значение - важно то, что указано)

  • Если вы используете перенаправление ([R], [R=30x] и т. Д.) - убедитесь, что новый URI начинается с / и содержит путь относительно корня вашего домена

  • (Если приведенное выше не помогло) Перезапустите Apache, очистите кеш браузера (особенно, если вы когда-то использовали [R=301])

Это то, что спасло мой день, может быть, оно спасет и ваш.

5 голосов
/ 22 июля 2009

Это из-за [R], что означает, что сервер будет перенаправлять на новый путь (таким образом, браузер пользователя выдаст новый запрос с недавно отправленным URI) вместо внутренней URI-трансляции в локальный путь.

В вашем первом RewriteRule есть косая черта в новом пути, поэтому сервер не пытается преобразовать его в локальный путь, но во втором правиле нет косой черты, поэтому он перенаправляет на полный локальный путь. Это также объясняет, почему он работает с набором RewriteBase.

Либо удалите [R] (вы можете заменить его на [L] в вашем случае, это позволит избежать попытки сервера соответствовать другим правилам, если он найдет соответствующий), либо добавьте косую черту перед "yz" в вашем второй RewriteRule.

Я бы предложил просто заменить [R] на [L]: таким образом, пользователь не увидит переписанный путь, как правило, то, что RewriteRules намерен делать (в основном для целей SEO), если только вы особенно хочу перенаправить ваших пользователей на новый URL.

0 голосов
/ 27 декабря 2011

Попробуйте и скажите мне результат:
# это не работает ... 127.0.0.1/wx перенаправляет на 127.0.0.1/C:/path/to/files/yz

RewriteRule ^ wx $ / yz [R]

положить / перед yz.

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