Mod_rewrite – создание чистых URL-адресов

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

Это URL основного сайта: http://www.test.com

У нас есть меню «страницы», в котором перечислены конкретные страницы, которые пользователи могут видеть. Это выглядит следующим образом: http://www.test.com/pages.php

В основном мы хотим, чтобы, когда кто-то посещает этот /pages.php, он должен перенаправить их на / pages (или с полным URL: test.com/pages ) или не перенаправить, просто покажите страницу, которая не найдена.

Он также должен работать с любой из этих возможных конфигураций:

  • / страница
  • / Главная /
  • /page.php

Я посмотрел на систему Stackowerflow, и она работает так, как мы этого хотим. Поэтому каждый раз, когда я смотрю на:

  • stackoverflow.com/questions
  • stackoverflow.com/questions/
  • stackoverflow.com/questions.php – показ страницы не найден

Это в основном то, что мне нужно. Я пробовал этот код, но он не работает полностью для моих нужд:

Options +FollowSymlinks RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.+)$ /$1.php [L,QSA] 

Я был бы рад, если бы кто-нибудь мог написать четкое объяснение, как это можно достичь. Также, если вы обнаружите, что этот пост дублируется, пожалуйста, напишите мне сообщение EXACT, потому что я искал этот точный вопрос, но я не нашел на нем никаких ответов.

благодаря

Ниже первое правило будет 301 перенаправлять * .php на URL без .php, а второе правило будет обрабатывать все другие URL-адреса, добавив к нему «.php»:

  RewriteCond %{REQUEST_URI} ^/(.*?)\.php$ RewriteRule ^/.*$ /%1 [R=301,QSA,L] RewriteRule ^/(.*)$ /$1.php 

Например,

/page.php перенаправляет на /page и обрабатывает page.php .

Хорошо, напиши что-то вроде этого.

 <VirtualHost *:80> ServerAdmin webmaster@localhost ServerName deli.localhost DocumentRoot /var/www/deli/ <Directory /var/www/deli/> Options -Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all RewriteEngine on ## Externally redirect clients directly requesting .(php|aspx|html|htm|pl|cgi|asp)+ page ## URIs to extensionless URIs ## If client request header contains php,aspx,html or htm file extension, redirect ## It avoids an infinite loop since "THE_REQUEST" is what the UA asks for, not what the ## server translates it to on the second pass. ## THE_REQUEST syntax is something like: GET /page.html HTTP/1.0 RewriteCond %{THE_REQUEST} ^[AZ]{3,9}\ /([^.]+)\.(php|aspx|html|htm|pl|cgi|asp)+(/.*)?\ HTTP [NC] RewriteRule ^([^.]+)\.(php|aspx|html|htm|pl|cgi|asp)+(/.*)?$ http://xyz.com/$1$3 [NC,R=301,L] FileETag none ErrorDocument 401 /401.php ErrorDocument 403 /403.php ErrorDocument 404 /404.php ErrorDocument 500 /500.php ErrorDocument 503 /503.php </Directory> ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined </VirtualHost> 

Нашел это на другом посту. По-видимому, он расширяет расширения .php, .html, .cgi с URL-адреса.

 RewriteCond %{REQUEST_URI} (.*)/$ RewriteCond %{REQUEST_FILENAME}\.html -f RewriteRule (.*)/$ $1.html [L] RewriteCond %{REQUEST_URI} (.*)/$ RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule (.*)/$ $1.php [L] RewriteCond %{REQUEST_URI} (.*)/$ RewriteCond %{REQUEST_FILENAME}\.cgi -f RewriteRule (.*)/$ $1.cgi [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.html -f [OR] RewriteCond %{REQUEST_FILENAME}\.php -f [OR] RewriteCond %{REQUEST_FILENAME}\.cgi -f RewriteRule .* %{REQUEST_FILENAME}/ [R=301,L]