Мой код 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
.. . и т.д…
Я знаю, что эта проблема возникает из-за косой черты в пути «download /», но как я могу решить это, используя mod_rewrite в .htaccess?
Могу ли я предотвратить переписывание по относительным путям? Или даже на внутренних путях моего собственного домена?
Как я могу решить это БЕЗ изменения моих относительных путей к абсолютным путям?
благодаря
Добавьте <base href="yoururl.com/beta/"; />
<base href="yoururl.com/beta/"; />
в HTML-заголовок. Также добавьте RewriteBase / beta / в htaccess, если вы находитесь в этой подпапке
вы всегда должны использовать абсолютные пути для изображений css и т. д., играя с mod_rewrite, но простым решением может быть игнорировать css, js, изображения и отдых в 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]
однако это может не сработать, если эти dir фактически зависят от текущего URL-адреса
Я протестировал тег, и нет необходимости указывать http: // Следующий код работал для меня:
<base href="<?php echo dirname($_SERVER['PHP_SELF']);?>/" />
Сервер никогда не узнает, что запрос пришел через относительный или абсолютный путь, так что вы ничего не можете с этим поделать. Как указано в другом ответе, вы можете делать исключения, но поддерживать их все и т. Д. В какой-то момент станет PITA. 😉
Я всегда использую абсолютные пути, особенно при переписывании, поэтому я бы предложил именно это, это самый простой способ
Добавление строки:
<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>