2015-03-08 3 views
2

Я создаю сайт, и я просто понял, что у меня есть эта проблема.htaccess mod rewrite, даже если существует папка

Когда пользователи идут на www.website.com/something Я хочу Htaccess открыть www.website.com/index.php?s=something, это прекрасно работает с моим текущим перенаправлении, за исключением если у меня есть это «что-то» как существующая папка.

"S" означает "подстраниц"

RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s=$1 [L] 

У меня есть проблемы, только если папка существует (/ JS/CSS/изображений ..etc), поэтому, когда я пытаюсь получить доступ к www.website. com/images он по-прежнему отображает правильную страницу, но это показывает это в адресной строке www.website.com/images/?s=images. Следует отметить, что если я изменил? S = изображения на? S = images213123, php все еще только распознает/images/as $ _GET ['s'];

У меня нет опыта с htaccess, но это то, что я собрал до сих пор, возможно, проблема в другом месте, а не в строке выше. Я попытался переместить [L] на 3-е правило, попытался отделить проблемное правило от остальных, попробовал все, что мог, с моими ограниченными знаниями, я не мог заставить ничего работать.

Любые подсказки или идеи очень ценятся! Спасибо заранее

Options +FollowSymlinks 
RewriteEngine On 
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ 
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301] 


RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^u/([a-zA-Z0-9_-]+)$ /u.php?u=$1 
RewriteRule ^p/([a-zA-Z0-9_-]+)$ /$1.php 
RewriteRule ^([a-zA-Z0-9_-]+)/userpage/([a-zA-Z0-9_-]+)/?$ /c.php?s=$1&c=$2 
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s=$1 [L] 


ErrorDocument 400 /index.php 
ErrorDocument 401 /index.php 
ErrorDocument 403 /index.php 
ErrorDocument 404 /index.php 
ErrorDocument 500 /index.php 

Edit: Добавление «DirectorySlash Off» и изменения условий и правил, как в ответ @ Джон Лин исправили проблему. Мне также пришлось очистить кеш Firefox, чтобы увидеть изменения. Это мой последний htaccess, который отлично работает для моей цели.

Options +FollowSymlinks 
RewriteEngine On 
DirectorySlash Off 
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ 
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301] 


RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^u/([a-zA-Z0-9_-]+)$ /u.php?u=$1 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^p/([a-zA-Z0-9_-]+)$ /$1.php 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-zA-Z0-9_-]+)/userpage/([a-zA-Z0-9_-]+)/?$ /c.php?s=$1&c=$2 

# I intentionally skipped the conditions here 
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s=$1 [L] 


ErrorDocument 400 /index.php 
ErrorDocument 401 /index.php 
ErrorDocument 403 /index.php 
ErrorDocument 404 /index.php 
ErrorDocument 500 /index.php 

ответ

0

Условия перезаписи применяются только к следующему правилу, поэтому у вас есть 1 условие и 4 правила. Это условие 1 применяется только к первому правилу, а другое 3 не имеет привязанных к ним условий. Вам необходимо убедиться, что все 4 из ваших правил не будут применяться к запросам на существующие файлы или каталоги:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^u/([a-zA-Z0-9_-]+)$ /u.php?u=$1 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^p/([a-zA-Z0-9_-]+)$ /$1.php 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-zA-Z0-9_-]+)/<userpage>/([a-zA-Z0-9_-]+)/?$ /c.php?s=$1&c=$2 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s=$1 [L] 
+0

@CristianBenescu это из-за mod_dir. Apache всегда будет перенаправлять запросы для каталогов, которые не имеют завершающего косая черта, если вы хотите отключить это, вы можете добавить 'DirectorySlash off', но это делает так, чтобы люди могли просматривать содержимое каталога, даже если есть индексный файл –

Смежные вопросы