Htaccess: додавання / видалення косої риски з URL-адреси


82

На моєму веб-сайті працює сценарій під назвою -> Сценарій шпалер WSS

Моя проблема -> Я намагався примусово видалити або додати кінцеву риску в кінці моєї URL-адреси, щоб запобігти дублюванню вмісту, а також очистити свої URL-адреси.

Я пробував всілякі і пробував все, що міг подумати, і завантажував із мереж, але такої удачі поки що немає! Це може бути швидким виправленням, але я так розглянув його, що, мабуть, сліпий до чогось мертвого очевидного.

Тому я представляю вам увесь свій .htaccessкод:

DirectoryIndex index.php

RewriteEngine on
RewriteRule ^download/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+) image.php?id=$1&width=$2&height=$3&cropratio=$4&download=1 [L]
RewriteRule ^file/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+) image.php?id=$1&width=$2&height=$3&cropratio=$4 [L]
RewriteRule ^preview/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+) wallpaper_preview.php?id=$1&width=$2&height=$3&name=$4 [L]
RewriteRule ^thumbnail/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/]+) image.php?wallpaper_id=$1&width=$2&height=$3&cropratio=$4&align=$5&valign=$6&file=$7 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+)/p([0-9]+) index.php?task=category&id=$1&name=$2&page=$3 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+)/([0-9a-zA-Z?-]+)/p([0-9]+) index.php?task=category&id=$1&name=$2&sortby=$3&page=$4 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+)/([0-9a-zA-Z?-]+)-([0-9]+) index.php?task=category&id=$1&sortby=$3&page=$4 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+) index.php?task=category&id=$1&name=$2 [L]
RewriteRule ^tag/([^/\.]+)/([0-9a-zA-Z?-]+)/([0-9]+) index.php?task=tag&t=$1&sortby=$2&page=$3 [L]
RewriteRule ^tag/([^/\.]+) index.php?task=tag&t=$1 [L]
RewriteRule ^profile/([0-9]+)?/([^/\.]+) index.php?task=profile&id=$1&name=$2 [L]
RewriteRule ^profile/comments/([0-9]+)?/([^/\.]+) index.php?task=users_comments&id=$1&name=$2 [L]
RewriteRule ^page/([0-9]+) index.php?task=view_page&id=$1 [L]  
RewriteRule ^register index.php?task=register [L] 
RewriteRule ^lost-password index.php?task=lost_pass [L] 
RewriteRule ^links index.php?task=links [L]
RewriteRule ^news/item/([0-9]+)/([^/\.]+) index.php?task=news&id=$1 [L]
RewriteRule ^news/page([0-9]+) index.php?task=news&page=$1 [L]
RewriteRule ^members/([^/\.]+)-([^/\.]+)/page([0-9]+)? index.php?task=member_list&sort=$1&order=$2&page=$3 [L]
RewriteRule ^members index.php?task=member_list [L]
RewriteRule ^messages index.php?task=messages [L]
RewriteRule ^submit index.php?task=submit [L]
RewriteRule ^search/([^/\.]+) index.php?task=search&q=$1 [L]
RewriteRule ^search index.php?task=search [L]
RewriteRule ^submit index.php?task=submit [L]
RewriteRule ^r-([0-9]+)?-([0-9]+)? go.php?id=$1&ref=$2 [L]
RewriteRule ^r-([0-9]+)? go.php?id=$1 [L]
RewriteRule ^([^/\.]+)/([0-9]+)/([^/\.]+) index.php?task=view&id=$2&name=$3 [L]
RewriteRule ^news/([^/\.]+) index.php?task=news&name=$1 [L]
RewriteRule ^profile/([^/\.]+) index.php?task=profile&name=$1 [L]
RewriteRule ^news index.php?task=news [L]
RewriteRule ^page/([^/\.]+) index.php?task=view_page&name=$1 [L]  
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([0-9a-zA-Z'?-]+)/([0-9]+) index.php?task=category&name=$1&sortby=$2&page=$3 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([^/\.]+) index.php?task=view&name=$2 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+) index.php?task=category&name=$1 [L]


## www reslove ##
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
## www reslove ##

## index reslove ##
Options +FollowSymLinks
RewriteCond %{THE_REQUEST} ^.*/index\.php
RewriteRule ^(.*)index.php$ http://www.epicwallpaper.net/$1 [R=301,L]
## index reslove ##

1
Також якщо хтось може виправити поганого хлопчика, чи не можете ви написати відповідь тут Дякую
Лука

Будь ласка, опублікуйте код тут.
Surreal Dreams

1
Редагуйте свою публікацію, вставте свій код у свою публікацію, виділіть її, натисніть "CTRL + K", щоб відформатувати її як код
Джон Лін

Ви справді маєте ' чи ? дозволено у вашому URI? Одне з RewriteRules (біля нижньої частини) передбачає це. Я стурбований тим, що вони можуть заплутати сервер навіть до того, як .htaccess зможе їх обробити.
Філ Перрі

Відповіді:


199

Прямо під RewriteEngine Onрядком додайте:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R] # <- for test, for prod use [L,R=301]

для забезпечення політики відсутності косої риски.

Щоб застосувати політику косої риски:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ /$1/ [L,R] # <- for test, for prod use [L,R=301]

EDIT : прокоментував R=301частини, оскільки, як пояснюється в коментарі:

Будьте обережні з цимR=301 ! Його наявність там змушує багато браузерів кешувати файл .htaccess необмежено довго : він якось стає незворотним, якщо ви не можете очистити кеш браузера на всіх машинах, які його відкрили. Під час тестування краще скористатися простими RабоR=302

Після завершення тестів ви можете використовувати R=301.


4
Боже, я міг би поцілувати тебе! Працював з примусовою косою рисою, що не відміняється, інша дала мені 500 помилок сервера Дякую, Джон Лін!
Лука

22
Правило no-trailing-slash не працює, якщо веб-сайт знаходиться в каталозі (наприклад example.org/blog/)
Gras Double

8
Будьте обережні з цим R=301! Наявність його змушує багато браузерів кешувати файл .htaccess необмежено довго: він якимось чином стає незворотним, якщо ви не можете очистити кеш браузера на всіх машинах, які його відкрили. Під час тестування краще скористатися простими "R" або "R = 302"
Джонатан Вебер

Коли VirtualDocumentRoot вимкнено, видаліть косу риску на початку, тобто .: $1замість /$1And, @JonathanWeber, файл .htaccess не обслуговується, але заголовок expires повідомляє браузерам, як довго кешувати ресурс.
двічі в

1
@Nrc, оскільки крім файлів та каталогів існують інші типи зіставлення, а також існує ймовірність того, що запит не відображається ні у файлі, ні в каталозі, але його потрібно переписати. Негатив гарантує, що те, що або було переписано, або вже перенесено на щось у файловій системі буде пропущено.
Джон Лін,

84

Щоб доповнити відповідь Джона Ліна, ось техніка без зворотних косих рисок, яка також працює, якщо веб-сайт знаходиться в каталозі (наприклад example.org/blog/):

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [R=301,L]


Для повноти, ось альтернативний наголос, який REQUEST_URIпочинається з косої риси (принаймні у .htaccessфайлах):

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /(.*)/$
RewriteRule ^ /%1 [R=301,L] <-- added slash here too, don't forget it

Просто не використовуйте %{REQUEST_URI} (.*)/$ . Оскільки в кореневому каталозі REQUEST_URIдорівнює /провідна коса риса, і це буде неправильно витлумачено як кінцеву скісну риску.


Якщо вам цікаво більше читати:

(оновлення: ця техніка тепер реалізована в Laravel 5.5)


1
Цей конкретний варіант справді корисний, особливо при використанні сучасних конвенцій щодо URL-адрес. Сподіваюся, ви не проти, я надсилаю його до сховища фрагментів htaccess .
alexw

1
Це усуває проблему, коли REQUEST_URI (корінь) інтерпретується як кінцева коса риса, що також викликає нескінченний цикл. Дякую
Руслан Абузант

Так, прийнята відповідь не застосовується, якщо веб-сайт знаходиться в каталозі, але ця відповідь з RewriteCond %{REQUEST_URI} (.+)/$видаляє лише одну останню кінцеву риску (наприклад, кілька переадресацій, необхідних з sth /// to sth // to sth / to sth). Для видалення всіх кінцевих RewriteCond %{REQUEST_URI} (.+?)/+$
скісних

1
Я теж про це думав. Хоча результат правильний, і, враховуючи, що це крайній випадок, я віддав перевагу простоті коду.
Gras Double

@GrasDouble, дякую, що давно шукали це рішення. випробував незліченну кількість методів, але у вас все вийшло нормально! велике спасибі.

3

Це те, що я використав для свого останнього додатка.

# redirect the main page to landing
##RedirectMatch 302 ^/$ /landing

# remove php ext from url
# /programming/4026021/remove-php-extension-with-htaccess
RewriteEngine on 

# File exists but has a trailing slash
# /programming/21417263/htaccess-add-remove-trailing-slash-from-url
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.*)/+$ /$1 [R=302,L,QSA]

# ok. It will still find the file but relative assets won't load
# e.g. page: /landing/  -> assets/js/main.js/main
# that's we have the rules above.
RewriteCond %{REQUEST_FILENAME} !\.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^/?(.*?)/?$ $1.php

1
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
## hide .html extension
# To externally redirect /dir/foo.html to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+).html
RewriteRule ^ %1 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)/\s
RewriteRule ^ %1 [R=301,L]

## To internally redirect /dir/foo to /dir/foo.html
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^([^\.]+)$ $1.html [L]


<Files ~"^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>

Це видаляє html-код або php, якщо ви доповнюєте його. Дозволяє додати кінцеву скісну риску, і вона з’являється, а також URL-адресу без кінцевої скісної риски, обходячи код 404. Плюс трохи додаткової безпеки.


Привіт, як би ви написали це для nginx? Я спробував запустити його в конвертері тут: winginx.com/en/htaccess, але цей результат дає мені нескінченний цикл:# nginx configuration location / { rewrite ^(.*)$ /%1 redirect; rewrite ^(.*)$ /%1 redirect; rewrite ^/([^\.]+)$ /$1.html break; } location ~ ^.*\.([Hh][Tt][Aa]) { deny all; }
Асле
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.