mod_rewrite VS относительные пути - PullRequest
5 голосов
/ 13 июня 2011

Мой код mod_rewrite:

Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)?$ index.php?url=$1 [L,NC]

Эта структура размещена на моем пути к серверу /beta

Когда я размещаю URL http://mydomain.com/beta/download все работает, переписывая в реальный путь http://mydomain.com/beta/index.php?url=download

Проблема возникает с относительными путями. Когда я ввожу URL http://mydomain.com/beta/download/box, перезапись переходит на http://mydomain.com/beta/index.php?url=download/box ... но ....

Все мои относительные пути, такие как моя папка css, моя папка js, файлы изображений ... все с относительным путем на моей странице index.php падает, потому что мои относительные пути становятся download/css, download/js, download/images ... и т.д ...

Я знаю, что эта проблема возникает из-за косой черты в пути "скачать /", но как я могу решить эту проблему, используя mod_rewrite в .htaccess?

Можно ли предотвратить переписывание в относительных путях? Или даже во внутренних путях моего собственного домена?

Как я могу решить, БЕЗ изменить мои относительные пути на абсолютные пути?

Спасибо

Ответы [ 5 ]

12 голосов
/ 13 июня 2011

Добавьте тег <base href="yoururl.com/beta/"; /> к вашей HTML-голове. Также добавьте RewriteBase / beta / в htaccess, если вы находитесь в этой подпапке

1 голос
/ 22 марта 2014

Я проверил тег, и нет необходимости указывать http: // У меня работает следующий код:

<base href="<?php echo dirname($_SERVER['PHP_SELF']);?>/" />
1 голос
/ 13 июня 2011

вы всегда должны использовать абсолютные пути для изображений css и т. Д., Когда играете с mod_rewrite, но простым решением может быть игнорирование css, js, images и rest в RewriteRule ^(.+)?$ index.php?url=$1 [L,NC]

RewriteRule ((js|css|images)\/.*)$ /$1 [L,NC]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)?$ index.php?url=$1 [L,NC]

однако это может не сработать, если эти каталоги на самом деле зависят от текущего URL

0 голосов
/ 15 февраля 2014

Добавление строки:

<BASE href="http://www.sitename.com/">

на моей странице внутри тега <head> отлично работает для меня. Его можно закодировать даже функцией PHP, чтобы автоматизировать это, чтобы вам не пришлось беспокоиться о копировании / вставке в других случаях.

Обновление:

<?php
$BaseDir = 'http://'.$_SERVER['SERVER_NAME'].substr($_SERVER["SCRIPT_NAME"], 0, strrpos($_SERVER["SCRIPT_NAME"],"/")+1);
?>

<head>
...
<BASE href="<?php echo $BaseDir; ?>">
...
</head>
0 голосов
/ 13 июня 2011

Сервер никогда не узнает, поступил ли запрос по относительному или абсолютному пути, поэтому вы ничего не можете с этим поделать. Как указано в другом ответе, Вы можете делать исключения, но поддержание их всех и т. Д. В какой-то момент станет PITA. ;)

Я всегда использую абсолютные пути, особенно при переписывании, поэтому я бы посоветовал, это самый простой способ

...