2012-10-12 9 views
8

Moja strona nie przekierowuje jak powinien ze względu na mój plik .htaccess, który jest ustawiony jako:mod_rewrite wyjątek dla konkretnego pliku

RewriteEngine on 
RewriteCond $1 !^(index\.php|resources|robots\.txt) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L,QSA] 

Sam używam takiej konfiguracji dla mojego Framework MVC więc dostać adresy URL jak /controller/method/argument jednak kiedy przekierowuję do /forum/login.php to tnie do/forum /.

Jak mogę dodać to jako wyjątek, tak, że będzie w stanie przekierować do /forum/login.php

znalazłem inną .htaccess w moim/forum/katalog może to być przyczyną problemu, jak również?

# BEGIN PunBB 

<IfModule mod_rewrite.c> 
    # MultiViews interfers with proper rewriting 
    Options -MultiViews 

    RewriteEngine On 

    # Uncomment and properly set the RewriteBase if the rewrite rules are not working properly 
    #RewriteBase/

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule . rewrite.php [L] 
</IfModule> 

Odpowiedz

21

Najpierw powiem wam jak czytać RewriteRule:

zacząć od pierwszego (lub następny) Wpisz RewriteRule:

RewriteRule ^(.*)$ index.php/$1 [L,QSA]

Pierwszy parametr jest wyrażeniem regularnym, które może odpowiadać żądanemu adresowi URL. ^(.*)$ dopasowuje wszystko i przechowuje to "wszystko" wewnątrz zmiennej, której można użyć później.

Tylko jeśli nie są poprzedzający wpisów RewriteCond i wyceniane są następne:

RewriteCond $1 !^(index\.php|resources|robots\.txt)

$1 jest odniesienie się do treści dopasowane do wnętrza pierwszych nawiasach RewriteRule. Jest to porównywane z drugim parametrem, który jest wyrażeniem regularnym zawierającym kilka nazw jawnych, a ! neguje wyrażenie, np. ta reguła pozwala na wykonanie RewriteRule tylko wtedy, gdy wyrażenie regularne nie pasuje. Jeśli ten warunek zwróci wartość true, zostanie przeanalizowany następny warunek.

RewriteCond %{REQUEST_FILENAME} !-f

Jeśli żądana nazwa pliku ma prawdziwego plik na twardym dysku, ten warunek jest spełniony.

RewriteCond %{REQUEST_FILENAME} !-d

Jeśli żądana nazwa pliku nie jest prawdziwy katalog ten warunek jest spełniony.

Tylko jeśli wszystkie te warunki są spełnione (są przykuci wraz z I), wracamy do reguły przepisywania:

RewriteRule ^(.*)$ index.php/$1 [L,QSA]

Efektem tego etapu przepisywania jest definiowany jako drugi i trzeci parametr. $1 jest używany ponownie tak samo, jak z treścią dopasowania, a parametry definiują, że ta reguła, jeśli jest początkowo dopasowana, będzie ostatnią (L) regułą, i że dowolny ciąg zapytania zdefiniowany w docelowym przeprogramowaniu zostanie dołączony do dowolnego ciągu zapytania w oryginalnym adresie URL (QSA).

Krytyka:

Zazwyczaj przepisywanie dla ram MVC starają się być tak wydajnych jak to możliwe. Wszystkie warunki przepisywania muszą zostać ocenione pod kątem pomyślnego przepisania. Zatrzymanie nastąpi tylko wtedy, gdy którykolwiek z ReRriteCond zwróci false. Każde żądanie, które zostanie przepisane, podlega wielu intensywnym testom cpu. Najpierw regex RewriteRule, a następnie regex w pierwszym RewriteCond, a następnie dwa testy harddisk w systemie plików dla pliku existing.

Z drugiej strony pierwszy RewriteCond wydaje się niepotrzebny. Testuje pewne nazwy i jeśli zostanie znalezione, przerwie przepisywanie. "index.php" powinien zostać wykryty przez drugi RewriteCond, ponieważ jest to istniejący plik (jak by to było, gdyby nie było przepisywania). Wszystko, co zaczyna się od "zasobów" będzie również dopasowane, ale prawdopodobnie nie powinno z tych samych powodów: Istniejące zasoby zostaną znalezione przez drugi RewriteCond. Ostatni plik "robots.txt". Dobrym pomysłem jest posiadanie jednego z nich, jeśli to możliwe, aby uniknąć 404, gdy roboty pobierają twoją witrynę.

Ponieważ nic nie zmieniasz w ciągu zapytania, dyrektywa [QSA] nie jest potrzebna.

ulepszenia:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [L] 
RewriteRule ^.*$ index.php [L] 

Pierwszy RewriteRule będzie pasował do całej żądanej trasy. Dwa RewriteCond są połączone z [LUB], więc pierwszy RewriteCond, który zwraca wartość true, anuluje dalszą ocenę. Pierwsze testy RewriteCond, jeśli żądany plik istnieje. Jeśli istnieje, zwraca wartość true, a przetwarzanie powraca do pierwszej reguły RewriteRule. Wyrażenie docelowe to "-", co oznacza "nie przepisuj". [L] przerywa dalsze przetwarzanie reguł przepisywania. Ostatecznie dla istniejącego pliku mamy tylko jeden test regex i jeden system plików, a następnie istniejący plik zostanie wysłany do przeglądarki.

Jeśli nie znaleziono pliku, pierwsze RewriteRule i RewriteCond nie zostaną uruchomione, więc [L] nie zatrzyma procesu. Tak więc jest wykonywana druga RewriteRule. Ten jest bezwarunkowy, a wyrażenie regularne jest takie samo jak poprzednio, pasuje do wszystkiego i przepisuje je na "index.php".

To przepisanie nie wywoła indeksu.php, jeśli istnieje jakikolwiek plik, w tym /forum/login.php.

Możesz zmienić sekundę na RewriteRule ^.*$ index.php/$0 [L], jeśli chcesz kontynuować przetwarzanie $_SERVER['PATH_INFO'] zamiast $_SERVER['REQUEST_URI'].

+0

Dziękujemy! Od miesięcy szukam tego poziomu wyjaśnień. – wallyk

+0

Poprawka działa teraz. –

+2

To jest tak niewiarygodnie dokładne i potrzebuje WAY więcej kredytu, niż zostało mu dane. –

2

spróbuj to:

RewriteEngine on 
RewriteCond $1 !^(index\.php|forum|resources|robots\.txt) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L,QSA] 

I tak:

# BEGIN PunBB 

# ---------------------------------------------------------------------- 
# Start rewrite engine 
# ---------------------------------------------------------------------- 

<IfModule mod_rewrite.c> 
    # MultiViews interfers with proper rewriting 
    Options -MultiViews 

    RewriteEngine On 

    # Uncomment and properly set the RewriteBase if the rewrite rules are not working properly 
    RewriteBase /forum/ 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule . rewrite.php [L] 
</IfModule> 


# ---------------------------------------------------------------------- 
# Better website experience for IE users 
# ---------------------------------------------------------------------- 

# Force the latest IE version, in various cases when it may fall back to IE7 mode 
# github.com/rails/rails/commit/123eb25#commitcomment-118920 
# Use ChromeFrame if it's installed for a better experience for the poor IE folk 

<IfModule mod_setenvif.c> 
    <IfModule mod_headers.c> 
     BrowserMatch MSIE ie 
     Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie 
    </IfModule> 
</IfModule> 

<IfModule mod_headers.c> 
    # Because X-UA-Compatible isn't sent to non-IE (to save header bytes), 
    # We need to inform proxies that content changes based on UA 
    Header append Vary User-Agent 
    # Cache control is set only if mod_headers is enabled, so that's unncessary to declare 
</IfModule> 


# ---------------------------------------------------------------------- 
# UTF-8 encoding 
# ---------------------------------------------------------------------- 

# Use UTF-8 encoding for anything served text/plain or text/html 
AddDefaultCharset utf-8 

# Force UTF-8 for a number of file formats 
AddCharset utf-8 .html .css .js .xml .json .rss 


# ---------------------------------------------------------------------- 
# A little more security 
# ---------------------------------------------------------------------- 

# Do we want to advertise the exact version number of Apache we're running? 
# Probably not. 
## This can only be enabled if used in httpd.conf - It will not work in .htaccess 
# ServerTokens Prod 


# "-Indexes" will have Apache block users from browsing folders without a default document 
# Usually you should leave this activated, because you shouldn't allow everybody to surf through 
# every folder on your server (which includes rather private places like CMS system folders). 
<IfModule mod_autoindex.c> 
    Options -Indexes 
</IfModule> 

# END PunBB 
+0

Nie jest to jeszcze wycinanie na just/forum /. –

+0

Zmieniono fragment kodu. Spróbuj teraz. –

+0

Nie jest jeszcze wycięty, sprawdziłem wszystkie pliki .htaccess na moim serwerze sieciowym. –