.htaccess сломать все CSS и JS, хотя я установил абсолютный путь - PullRequest
3 голосов
/ 12 октября 2010

Вот мой файл .htaccess

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !=cms

RewriteRule ^([^/]*)/search/([^/]+)$  index.php?lang=$1&id=search&searchword=$2 [L]
RewriteRule ^([^/]*)/([^/]*)$  index.php?lang=$1&id=$2 [L]

Он не работает так, как я ожидал.

Мои .css, .js файлы имеют абсолютный путь, например http://bs.am/finance/css/style.css (все мои файлы в папке finance)

Первое правило разбивает все файлы CSS и JS, ноесли я заменяю места rewriteRules, все работает нормально.

Может ли кто-нибудь объяснить такое поведение?

Я также пытался RewriteCond %{REQUEST_FILENAME} !^(.+)\.css$, но это не помогло.

Большое спасибо

Ответы [ 2 ]

2 голосов
/ 12 октября 2010

Судя по вашему вопросу, ваш файл .htaccess находится в папке / finance / . Если это так, проблема заключается в том, что ваш второй RewriteRule будет соответствовать запросам ваших скриптов и таблиц.

Условия, которые у вас уже есть, позволят вам избежать этой проблемы, но они применяются только к первому правилу, которое идет после них (ваше правило поиска). Как обычно, есть несколько разных способов исправить ситуацию, но самый простой - скопировать свой блок RewriteCond, чтобы он применился и ко второму правилу. Это будет выглядеть следующим образом:

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 =cms
RewriteRule ^([^/]*)/search/([^/]+)$  index.php?lang=$1&id=search&searchword=$2 [L]

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !=cms
RewriteRule ^([^/]*)/([^/]*)$  index.php?lang=$1&id=$2 [L]

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

Альтернативный подход

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond $1 !=cms
RewriteRule ^([^/]*) - [S=2]

RewriteRule ^([^/]*)/search/([^/]+)$  index.php?lang=$1&id=search&searchword=$2 [L]
RewriteRule ^([^/]*)/([^/]*)$  index.php?lang=$1&id=$2 [L]

В этом подходе, если какое-либо из ваших условий соответствует, мы пропускаем следующие два правила (обозначенные S=2. Это то же самое, что применять блок условий к обоим из них. Как Gumbo упоминает , вы также можете использовать флаг L вместо S=2, чтобы игнорировать каждое правило, которое следует за этим блоком в случае совпадения ваших условий. Какой из этих параметров является наиболее подходящим, зависит от того, какие другие правила вы можете пожелать добавить в будущем.

1 голос
/ 13 октября 2010
Директива

A RewriteCond относится только к следующим следующим RewriteRule.Таким образом, ваши три RewriteCond директивы относятся только к первой RewriteRule, но не ко второй, которая не имеет условий.

Поэтому, чтобы исключить существующие файлы и каталоги для второй RewriteRule, вам необходимонапишите те же RewriteCond s перед другим правилом:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !=cms
RewriteRule ^([^/]*)/search/([^/]+)$  index.php?lang=$1&id=search&searchword=$2 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !=cms
RewriteRule ^([^/]*)/([^/]*)$  index.php?lang=$1&id=$2 [L]

Но вы также можете использовать правило, которое останавливает процесс перезаписи, когда запрос может быть сопоставлен с существующим файлом или каталогом:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

Поместите это правило перед другими вашими правилами, и процесс перезаписи остановится с этим правилом.

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