Проблема с mod_rewrite при доступе к каталогу - PullRequest
0 голосов
/ 21 декабря 2011

Мой код:

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/

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

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

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

Если указан http://mysite/images/, mod_rewrite перенаправляет на http://mysite/images/index.php?page=images вместо http://mysite/index.php?page=images

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

Я пробовал это:

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 при упоминании имени каталога. Но независимо от того, какое имя я укажу, например: http://mysite/contactus, оно перейдет на URL: http://mysite/index.php?page=contactus. Даже если я использую имя каталога, например: http://mysite/js, оно перейдет к: http://mysite/index.php?page=js

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

Ответы [ 3 ]

0 голосов
/ 21 декабря 2011

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

Тогда вы должны немедленно их игнорировать. Попробуйте добавить эту строку сразу после 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 голосов
/ 21 декабря 2011

Для проблемы с каталогами я обычно заставляю косую черту

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^\.]+[^/])$    $1/ [R]
0 голосов
/ 21 декабря 2011
RewriteEngine on
RewriteBase /
RewriteRule ^article/([a-z]+)/?$ index.php?page=article&name=$1 [L]
RewriteRule ^([a-z]+)/*$ /index.php?page=$1 [L]

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


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

...