Почему Apache RewriteRule показывает локальные пути?
Я пытаюсь использовать RewriteRules в .htaccess
с относительными путями, но Apache, кажется, хочет выводить путь физический, а не сервер, когда я пытаюсь для вывода относительного пути. Абсолютные и серверно-корневые пути работают нормально. Например:
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?
Ответы
Ответ 1
Для тех, кто прибыл сюда из Google (например, меня), короткий контрольный список:
-
Удостоверьтесь, что у вас есть RewriteBase /
(или любое другое значение - это важное утверждение)
-
Если вы используете перенаправление ([R]
, [R=30x]
и т.д.) - убедитесь, что новый URI начинается с /
и содержит путь относительно вашего корня домена
-
(Если выше не помогло) Перезапустите Apache, очистите кеш браузера (особенно если вы использовали [R=301]
в какой-то момент)
Что спасло мой день, может быть, это тоже спасет вас.
Ответ 2
Это из-за [R], что означает, что сервер перенаправит новый путь (так что пользовательский браузер выдает новый запрос с недавно отправленным uri) вместо того, чтобы внутренне переводить URI на локальный путь.
В вашем первом RewriteRule в новом пути есть косая черта, поэтому сервер не пытается перевести его на локальный путь, но во втором правиле отсутствует слэш, поэтому он перенаправляется на полный локальный путь. Это также объясняет, почему он работает с набором RewriteBase.
Либо удалите [R] (вы можете заменить его на [L] в вашем случае, это позволяет серверу, пытающемуся сопоставить другие правила, когда он найдет соответствующий), или добавьте косую черту перед "yz" в вашем второй RewriteRule.
Я бы предложил просто заменить [R] на [L]: таким образом, пользователь не увидит переписанный путь, который, как правило, намеревается сделать RewriteRules (в основном для целей SEO), если только вы в частности, хотите перенаправить пользователей на новый URL.
Ответ 3
Попробуйте это и скажите мне результат:
# это не работает... 127.0.0.1/wx перенаправляет на 127.0.0.1/C:/path/to/files/yz
RewriteRule ^ wx $/yz [R]
put/before yz.