Мод Переписать проблемы с путями - PullRequest
4 голосов
/ 18 ноября 2009

Я успешно создал правила перезаписи для обработки URL-адресов, таких как

http://example.com/xyz

http://example.com/xyz/

http://example.com/xyz/abc

http://example.com/xyz/abc/

Вот мод переписать и регулярное выражение:

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^/?([0-9]+)(?:\/)?$ /index.php?p=$1 [L]
RewriteRule ^/?([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1 [L]
RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$2 [L]

Это прекрасно работает, но проблема в том, что когда я перехожу на http://example.com/xyz/abc,, мой скрипт получает правильный ввод (n = abc), но пути перепутаны, поэтому все относительные URL в моем коде не работают, поскольку они теперь относительно xyz вместо корня.

Есть ли способ обойти это вообще? Как вы можете видеть выше, я попытался перенаправить в /index.php, чтобы заставить путь быть правильным. После долгого дня регулярных выражений и кода мой мозг зажжен, так что я надеюсь, что это не что-то катастрофически тривиальное.

Ответы [ 5 ]

8 голосов
/ 18 ноября 2009

Используйте элемент HTML base, чтобы все относительные URL-адреса использовали путь, отличный от того, который отображает браузер.

<base href="http://www.example.com/"/>
...
<a href="relative/url">link</a>

Относительный URL будет использовать "http://www.example.com" в качестве своей базы, даже если браузер считает, что смотрит на страницу" http://www.example.com/xyz/". Таким образом, ссылка идет на "http://www.example.com/relative/url" вместо «http://www.example.com/xyz/relative/url"

И существует способ переполнения стека, при котором каждый URL является либо абсолютным путем (к ресурсам, таким как изображения), либо путями, включая корень (т.е. "/ feeds / questions / 123"), которые избегают относительного пути вопросы.

7 голосов
/ 18 ноября 2009

Три варианта:

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

<base href="http://yoursite/">

2) Измените все ваши ссылки на полностью определенные URI

<a href="http://yoursite/yourpage.html">

3) Используйте префикс "/", чтобы показать, что путь указан относительно корня в каждом URI.

<a href="/yourpage.html">

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

2 голосов
/ 18 ноября 2009

Изменить: я предполагаю, что вы говорите об URL в вашем HTML-коде, например к изображениям и таблицам стилей, которые повреждены.

Нет, насколько я знаю, пути нет, потому что браузер видит путь и запрашивает ресурсы относительно него. Это не имеет ничего общего с сервером, и вы ничего не можете сделать.

Вам придется либо использовать другой разделитель, который не интерпретируется как разделитель каталогов (например, подчеркивание), либо использовать абсолютные пути, либо использовать тег . Однако я никогда не использовал базовый тег, и он не очень хорошо выглядит, куда бы вы ни посмотрели. Лучше всего было бы переключиться на абсолютные пути.

1 голос
/ 18 ноября 2009

Я пытался использовать элемент BASE на своих страницах в качестве ярлыка вместо изменения всех URL. Добавьте базовый элемент следующим образом:

<base href="/">

А вот и результаты:

This:    <link type="text/css" rel="stylesheet" href="my.css">
Becomes: <link type="text/css" rel="stylesheet" href="/my.css">

This:    <script type="text/javascript" language="javascript" src="include/my.js"></script>
Becomes: <script type="text/javascript" language="javascript" src="/include/my.js"></script>

This:    <a href="foo.html">
Becomes: <a href="/foo.html">

This:    <a href="foo/bar.html">
Becomes: <a href="/foo/bar.html">

Вы всегда можете переопределить базовый тег при необходимости:

This:    <a href="/foo">
Remains: <a href="/foo">

This:    <a href="/foo/bar/">
Remains: <a href="/foo/bar/">
1 голос
/ 18 ноября 2009

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

RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ $1/index.php?n=$2 [L]

или альтернативно (в зависимости от того, чего вы пытаетесь достичь):

RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1/$2 [L]
...