Удаление расширения .php с помощью mod_rewrite

Я хочу установить mod_rewrite, чтобы я мог ссылаться на страницу без расширения .php, но переписал ее, чтобы включить расширение php. Это будет работать на сервере 1 & 1.

Есть ли хорошие ссылки, чтобы я мог больше узнать себя?

Ответ 1

RewriteEngine On
RewriteRule something something.php [L]

http://example.com/something будет обрабатываться так, как если бы это был запрос на something.php

Чтобы перенаправить все запросы, которые не являются физическим файлом, с тем же именем, но с .php:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.*) $1.php [L]

Ответ 2

Принятый ответ выше не удаляет расширение .php из URL-адресов, он просто позволяет вам просматривать файлы .php без расширения. Чтобы полностью удалить расширение .php из URL-адресов, вы можете использовать следующие правила в root/.htaccess:

RewriteEngine on

#1)externally redirect "/file.php" to "/file"   
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
#2)Internally map "/file" back to "/file.php"
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,L]

Ответ 3

Возможно, что вы действительно хотите, это просто способ не иметь суффикса вообще. лучший способ, который я нашел, заключается в использовании директивы Files в .htaccess или в Файлы конфигурации apache:

<Files myscript>
   SetHandler cgi-script
</Files>

Это позволяет избежать некоторых недостатков перезаписи, например, прямого доступа .php файл.

Ответ 4

.htaccess файл: добавьте следующие строки:

Options +MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

https://alexcican.com/post/how-to-remove-php-html-htm-extensions-with-htaccess/

Теперь вам нужно будет проверить условие AllowOverride в файле apache2.log: установите параметры AllowOverRide All в корневой каталог вашего веб-сайта:

    Options Indexes FollowSymLinks  
    AllowOverride All  
    Require all granted

Если вы попытаетесь получить доступ к своей веб-странице без расширения .php, вы можете запустить следующую ошибку в файле apache error.log:   /var/www/html/web/.htaccess: Недопустимая команда 'RewriteEngine', возможно, с ошибкой или определена модулем, не включенным в конфигурацию сервера

Чтобы исправить это: у вас нет установленного модуля mod_rewrite. Чтобы установить его: Выполните следующую команду: ln -s/etc/apache2/mods-available/rewrite.load/etc/apache2/mods-enabled/rewrite.load

.htaccess: Неверная команда 'RewriteEngine', возможно, с ошибкой или определена модулем, не включенным в конфигурацию сервера

Опять же, после обновления веб-страницы вы можете получить следующую ошибку в файле error.log:

[negotiation:error] [pid 4650] [client 127.0.0.1:46461] AH00687: Negotiation: discovered file(s) matching request: /var/www/html/web/test (None could be negotiated). (I was trying to access localhost/web/test.php using the url: localhost/web/test)

Чтобы исправить это, вам нужно добавить следующие строки в apache2.conf:

<IfModule mod_mime.c>
AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtml
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php4
AddType application/x-httpd-php .html
AddType application/x-httpd-php-source .phps

https://forums.digitalpoint.com/threads/htaccess-addtype-application-x-httpd-php-php-htm-html-and-maybe-a-fix.7584/#post-2491687

Теперь я могу получить доступ к файлу test.php, используя только имя файла: test

Ответ 5

Этот параметр сделает чистые URL-адреса дружественных SEO. Расширения Removing.php из видимого URL-адреса и обеспечения доступа к URL-адресу без .php будут по-прежнему отображать .php файл. Мне не удалось найти другой ответ, который был достигнут на нескольких потоках.

Не забудьте включить функцию mod rewrite. В Debian или Unbuntu Linux будет работать

sudo a2enmod переписать

и

sudo service apache2 restart

Измените соответствующий раздел вашего файла apache2.conf следующим образом.

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule (.*) $1.php [L]
        RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
        RewriteRule ^ /%1 [NC,L,R]
</Directory>

Если вы используете .htaccess для повторной записи, убедитесь, что apache2.conf хотя бы включил эти опции.

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
        RewriteEngine On
</Directory>

Наконец, при установке Apache вам также необходимо установить AllowOveride All в файле .conf в /etc/apache 2/sites-available или/etc/apache2/sites-enabled.
Похоже, переписывание из файла apache2.conf, в отличие от .htaccess, выполняется быстрее.

Ответ 7

По какой-то причине я не смог заставить какое-либо другое решение работать исправно. Я помещал это в файл .htaccess в корень моего сайта. Надеюсь, это сработает для вас.

RewriteEngine on #only use this once per .htaccess
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php 

Важно помнить, что если ваш заголовок или URL-адрес содержит расширение .php, он не будет удален. Вам нужно будет удалить расширение.

Используйте это...

header 'location: /login';

а не это...

header 'location: /login.php';

Ответ 8

Для управления несколькими отдельными файлами может быть проще избежать RewriteEngine.

Я использовал это:

<Files $filename>
   SetHandler application/x-httpd-php
</Files>

Это менее мощный и гибкий, чем переписывание, но, вероятно, быстрее и похоже на путь, если вы хотите просто иметь несколько конкретных файлов, обрабатываемых как PHP.