2016-03-15 2 views
-3

В моем файле htaccess я добавил правило перенаправления url/abc/xyz на url/abc/xyz.php, так что теперь, даже когда я пытаюсь получить доступ к url ​​/ abc.php, он перенаправляет меня на url/а/Ошибка перенаправления правил HTACCESS

Помогите мне с этим .. Моим кодом прямо сейчас:

# To externally redirect /dir/foo.php to /dir/foo 
RewriteCond %{THE_REQUEST} ^GET\s([^.]+)\.php\s [NC] 
RewriteRule^%1 [R,L] 

## To internally forward /dir/foo to /dir/foo.php 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteCond %{QUERY_STRING} ^$ 
RewriteRule ^(.*?)/?$ $1.php [L] 

Что я хочу:

URL/abc.php & URL/а должны перейти URL/abc.php

URL/abc.php/# х & URL/ABC/# х следует перейти URL/abc.php/# х

+0

403 Запретный ошибка, так как он пытался получить доступ место, которое не существует. –

+0

все расположены на корне. http://domain.com/abc правильно ведет к http://domain.com/abc.php. Проблема связана с http://domain.com/abc.php/#x, которая перенаправляется на http://domain.com/abc/#x –

+0

, почему вы хотите, чтобы url/abc.php указывал на URL/abc.php? Почему бы не просто исключить возможность использования .php в адресной строке? – kojow7

ответ

1

фрагмент URL (#) никогда не отправляется на сервер, так что вы не можете использовать mod_rewrite перенаправить его. Другими словами, # интерпретируется только в браузере, поэтому вам не нужно беспокоиться об этом в .htaccess.

Этот код должен работать для вас, или, по крайней мере, вы начали:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME}\.php -f 
    RewriteRule ^(.*)$ $1.php 
</IfModule> 

Я также оградил его в IfModule, чтобы проверить, если mod_rewrite включен первым.

Мой предпочтительный способ заключается в перенаправлении всего на index.php, а затем там будет PHP-код, который разбивает URL-адреса и перенаправляет их на соответствующие страницы. Это очень хорошо работает с системами Model-View-Controller (MVC) и другими подобными вариантами. Это также позволяет загружать общие настройки сайта для всех из одного места, а не во многие места. Вот код, который я хотел бы использовать для этого типа установки:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteCond %{REQUEST_URI} !^/img/[0-9a-zA-Z_\-]+\.(gif|jpg|png)$ 
    RewriteCond %{REQUEST_URI} !^/css/[0-9a-zA-Z_\-]+\.css$ 
    RewriteCond %{REQUEST_URI} !^/js/[0-9a-zA-Z_\-]+\.js$ 
    RewriteRule ^.+$ index.php [L] 
</IfModule> 

Первые три строки говорит не перенаправлять любые изображения, CSS или JS файлы в указанных каталогах.

+0

ok, есть ли другой способ достичь этого? Я очень новичок в htaccess. –

+0

Он должен работать без него. – kojow7

+0

@AniMenon Я немного изменил свой пример. Первый должен работать для вас, а второй - мой предпочтительный метод. – kojow7

3

Если я интерпретированы ваши намерения правильно, следующие правила перезаписи должны служить ваши пожелания:

# Enable rewriting 
RewriteEngine On 

# Define site root 
RewriteBase/

# Do not rewrite for image, css or js files 
RewriteRule \.(css|jpe?g|gif|png|js)$ - [L] 

# Add index.php to requests ending with a trailing slash 
RewriteRule ^([a-z0-9_\-/]*/)?$ $1index.php [NC,R=301,L] 

# Add .php to the end of a request without a trailing slash 
RewriteRule ^(([a-z0-9_\-]+/)*[a-z0-9\-]+)$ $1.php [NC,R=301,L] 

Что правила делают:

  • Rewriting происходит относительно корня (/) из домен
  • Правила перезаписи будут игнорировать любой файл с расширением файла, указанным в правиле № 2.
  • Запросы на http://example.com/ (или)), http://example.com/foo/ и http://example.com/foo/bar/ будет переписан http://example.com/index.php, http://example.com/foo/index.php и http://example.com/foo/bar/index.php соответственно
  • Запросы на http://example.com/baz и http://example.com/baz/boo будут переписаны http://example.com/baz.php и http://example.com/baz/boo.php соответственно
+0

Это было полезно, спасибо. –

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