2011-12-21 3 views
0

Мой код:Проблема с mod_rewrite когда доступ к каталогу

RewriteEngine on 
RewriteBase/
RewriteRule ^article/([a-z]+)/?$ index.php?page=article&name=$1 [L] 
RewriteRule ^([a-z]+)/?$ index.php?page=$1 [L] 

Я использую WAMP и имел настроить виртуальный хост. В моем index.php есть код для передачи страницы и проверки, существует ли она (в базе данных). Если нет, отобразите сообщение об ошибке. Он работает нормально.

Например: http://mysite/contactus/

Но это не будет работать, если я использую имя каталога как PAGE_NAME в URL. Например: http://mysite/images/. Это приведет к отображению страницы не найденной ошибки (т. Е. Проверяет базу данных и не найдена страница, поэтому отображение «не найдено»). Но на странице не будут отображаться изображения, css (связанный файл). Кроме того, он отображает http://mysite/images/?page=images в адресной строке.

Как и я, если у меня есть js папка, которая используется для хранения файлов javascript, проблема выше. Таким образом, проблема возникает, если имя какого-либо подкаталога передается как pagename.

Как это решить?

Когда http://mysite/images/ подается, mod_rewrite перенаправляет к http://mysite/images/index.php?page=images вместо http://mysite/index.php?page=images

Edit Скажите, пожалуйста, как блокировать хотлинкинга файлов и директории, и перенаправление на главную страницу или отправить ошибку заголовка браузера?

Я попытался это:

RewriteEngine on 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*) http://%{HTTP_HOST} [R,L] 
RewriteRule ^article/([a-z]+)/?$ /index.php?page=article&name=$1 [L] 
RewriteRule ^([a-z]+)/?$ /index.php?page=$1 [L] 

Редактировать Новый код (полу-рабочий):

RewriteEngine on 
RewriteBase/

# remove trailing slash ONLY if it is not an existing folder 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ /$1/ [R,L] 

RewriteRule ^article/([a-z]+)/?$ http://%{HTTP_HOST}/index.php?page=article&name=$1 [L] 
RewriteRule ^([a-z]+)/?$ http://%{HTTP_HOST}/index.php?page=$1 [L] 

Этот код будет устранить проблему с не отображаются фотографии и CSS, когда имя каталога упомянуто. Но что бы ни называл pagename, например: http://mysite/contactus, он будет URL: http://mysite/index.php?page=contactus. Даже если я использую имя каталога, например: http://mysite/js, он перейдет к: http://mysite/index.php?page=js

Я очень смущен.

ответ

0
RewriteEngine on 
RewriteBase/
RewriteRule ^article/([a-z]+)/?$ index.php?page=article&name=$1 [L] 
RewriteRule ^([a-z]+)/*$ /index.php?page=$1 [L] 

Вы должны поставить косую черту спереди.


Редактировать: изменил? до *

+0

спасибо. Это решит проблему 'http: // mysite/images /? Page = images'. Теперь он будет показывать только «http: // mysite/images /». Но изображения все еще не отображаются. Кроме того, если я поставлю «http: // mysite/images» (без косой черты), он все равно покажет «http: // mysite/images /? Page = images' –

+0

, что с редактированием? – RageZ

+0

Да. Я тоже попробовал «*». Фотографии (внутри html) не отображаются. Но проблема 'http: // mysite/images /? Page = images' исправлена ​​для' http: // mysite/images/'. Не для 'http: // mysite/images' (без косой черты) –

0

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

Затем вы должны немедленно их игнорировать. Попробуйте добавить эту строку сразу после RewriteBase, как это:

RewriteEngine on 
RewriteBase /rewrite/ 
RewriteRule ^/(images|js)/(.*)$ - [L] 
RewriteRule ^article/([a-z]+)/?$ index.php?page=article&name=$1 [L] 
RewriteRule ^([a-z]+)/?$ index.php?page=$1 [L] 

Затем эти подкаталоги будут обслуживаться сразу, обходя таким образом следующий RewriteRule набор.

+0

Не работает. Кроме того, я не хочу жестко указывать имена каталогов, потому что будет больше dirs. –

+0

@Vpp Man: но он * работает * с вашим набором правил, я проверил на своем собственном сервере. Пожалуйста, см. Мой отредактированный ответ для ясности. Я могу понять, если вы не хотите кодировать любые dirnames. –

0

Для задачи с каталогами я обычно заставить слэш

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^\.]+[^/])$ $1/ [R] 
Смежные вопросы