Mod_rewrite дает пользователям собственный URL, необходимо исключить некоторые случаи - PullRequest
1 голос
/ 05 февраля 2011

Я создаю небольшой локальный сайт социального хорошего сообщества, где у каждого проекта есть свой собственный URL, так что когда username = 'foo', URL становится http://website.com/foo похожим на Twitter. Несмотря на то, что у меня нет опыта работы с htaccess, мне удалось заставить его работать в значительной степени. Однако сейчас я сталкиваюсь с проблемами, когда кто-то печатает http://website.com/subdomain/foo. Теперь он также пытается найти имя пользователя и отобразить страницу, но я не хочу, чтобы это работало, и хочу показать им нашу страницу 404.

Кроме того, на некоторых поддоменах (т.е. около) у нас есть другие страницы, такие как «ourstory.php». Я действительно хотел бы отображать «about / ourstory» вместо about / ourstory.php, но только для выбранных поддоменов.

Наконец, при наличии структуры 'website.com/subdomain/subdomain' он генерирует внутренние ошибки сервера, когда требуются другие файлы php, даже если используются абсолютные пути.

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

Этот мод переписывает три вещи:
1. Удалите «www» перед адресом;
2. Второй проверяет, что, когда они просто набирают домашнюю страницу, они переносят их на домашнюю страницу (удаление этого приведет к пустой домашней странице по какой-то причине, может ли это быть сделано по-другому?);
3. Когда вводится имя, которое не является поддоменом, оно перенаправляет их на страницу профиля и делает URL-адрес именем пользователя.

<IfModule mod_rewrite.c>
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteCond %{REQUEST_FILENAME} !-d 
 RewriteCond %{REQUEST_URI} !-f
 RewriteCond %{REQUEST_URI} !-d 
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^(.+)/$ http://website.com/$1 [R=301,L]
</IfModule>

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteCond %{REQUEST_FILENAME} !-d 
 RewriteCond %{REQUEST_URI} !-f
 RewriteCond %{REQUEST_URI} !-d 
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_URI} !\.(css|gif|ico|jpg|js|png|swf|txt)$
 RewriteRule ^(.{5,16})$ profile.php?scrname=$1
 RewriteRule ^(.+)(\.php|\.html)/$  /$1$2 [R=301,L]
</IfModule>

Опять же, любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Я добился определенного прогресса с тех пор, как задал вопрос. Вот (на первый взгляд, очень простой) mod_rewrite, с которым я закончил:

<IfModule mod_rewrite.c>
   //mod_rewrite by Marc
   RewriteEngine On
   RewriteCond %{HTTPS} !=on
   RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
   RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
   RewriteCond %{SCRIPT_FILENAME} !-d  
   RewriteCond %{SCRIPT_FILENAME} !-f 
   RewriteRule ^(\w+)$ ./project.php?id=$1
</IfModule>

Он делает все, что хотел, исправил внутренние ошибки сервера, и поэтому мне больше не нужно переписывать, чтобы удалить .php. Я надеюсь, что это может помочь кому-то еще.

1 голос
/ 05 февраля 2011

Возможно, вам будет проще поддерживать, если вместо этого вы используете фронт-контроллер .По сути, вы бы перенаправили все запросы, которые не относятся к статическим файлам, к одному сценарию php, который затем может выполнять расширенные правила, более легко выраженные в коде, чем правила mod_rewrite.

Ваш .htaccess может выглядеть немного похожим:

RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d 
RewriteRule ^(.*)$ index.php?q=$1

В своем PHP-коде вы можете обработать это, изучив $_GET['q'], чтобы решить, какую страницу отображать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...